Разница в потоках между в Java и в C ++ / Qt

0

Версия java работает точно так, как ожидалось, в то время как C++ сбой. Версия C++ как-то работает, когда 1 <= N_THREADS <= 2, но в противном случае она терпит неудачу.

Я изо всех сил старался сделать работу C++ работоспособной, но не удалось и до сих пор не знаю, что происходит. Конечно, я буду знать проблему, изучая системные потоки и исходный код Qthread, и да, я постараюсь это сделать, но мне также нужно решение.

Любая помощь оценивается.

thread_test.java

class my_thread extends Thread
{
    int n;

    my_thread()
    {
        n = 0;
    }

    public void run()
    {
        try
        {
            while (n < 10)
            {
                System.out.print(n++);
                Thread.sleep(1000);
            }
        }
        catch (InterruptedException e)
        {
            return;
        }
    }
}

public class thread_test
{
    public static void main(String[] args)
    {
        final int N_THREADS = 10;
        for (int i = 0; i < N_THREADS; i++)
        {
            new my_thread().start();
        }
    }
}

thread_test.cpp

#include <array>
#include <QTextStream>
#include <QThread>

QTextStream qout(stdout);

class my_thread : public QThread
{
public:
    int n;

    my_thread()
    {
        n = 0;
    }

    void run()
    {
        while(n < 10)
        {
            qout << n++ << flush;
            msleep(1000);
        }
    }
};

int main()
{
    enum { N_THREADS = 10 };
    std::array<my_thread, N_THREADS> thread_array;
    for (auto& thread : thread_array)
    {
        thread.start();
    }
    for (auto& thread : thread_array)
    {
        thread.wait();
    }
    return 0;
}

РЕДАКТИРОВАТЬ

Читая комментарии и при поиске в Google, проблема в коде C++ определенно, по-видимому, использует не-поточные операции в нескольких потоках. Таким образом, моя проблема будет решена путем создания поточного QTextStream так же, как Java PrintStream.

Основываясь на моем быстром веб-поиске, я предполагаю, что процесс, в котором QTextStream взаимодействует со стандартным выходом, не должен выполняться несколькими потоками одновременно, поскольку существует только один стандартный вывод. Но было бы слишком медленно заставить все остальные потоки ждать, пока один поток взаимодействует со стандартным выходом. Поэтому я думаю, что правильное решение будет делать очередь для хранения вывода, который будет написан, как ссылки QString, в то время как stdout занят и не может принимать больше задач одновременно. Ну, тогда как я могу гарантировать, что эта очередь будет потокобезопасной? Сейчас я очень смущен. Кроме того, как реализована технология печати в формате Java PrintStream как потокобезопасная? Пожалуйста, помогите мне организовать эти проблемы и найти правильное решение этой проблемы.

  • 1
    Единственное, о чем я могу думать прямо сейчас: вы уверены, что QTextStream потокобезопасен? qout ли это, если вы qout строку qout или замените ее на qDebug ()?
  • 2
    в противном случае это не дает нам никакого представления о том, что на самом деле происходит
Показать ещё 4 комментария
Теги:
multithreading
qt

1 ответ

0

В Qt вы не должны получать QThread потому что вы хотите, чтобы functionality run in a thread а не в thread having that functionality такую thread having that functionality.

просто взгляните на эти ссылки, первый описывает поток более общий, второй помогает реализовать...

http://blog.qt.digia.com/blog/2010/06/17/youre-doing-it-wrong/

Каков правильный способ реализации QThread... (пример, пожалуйста...)

ура

Ещё вопросы

Сообщество Overcoder
Наверх
Меню