2014-11-18 2 views
0

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

Я изо всех сил старался сделать работу на С ++ работоспособной, но не удалось и до сих пор не знаю, что происходит. Конечно, я буду знать проблему, изучая системные потоки и исходный код 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; 
} 

EDIT

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

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

+1

Единственное, что я могу подумайте прямо сейчас: Вы уверены, что QTextStream является потокобезопасным? Работает ли это, если вы оставите строку 'qout' или замените ее на qDebug()? – anderas

+2

* В противном случае это не дает нам никакого представления о том, что действительно происходит – ortis

+0

@ortis Иногда программа просто перестает работать, в большинстве случаев она печатает примерно в два раза больше, чем должна, с большим количеством неожиданных пробелов между номерами ... – xiver77

ответ

0

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

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

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

what is the correct way to implement a QThread... (example please...)

веселит