2013-09-12 2 views
1

Позвольте пояснить, что я знаю, что поддержка многопоточности добавляется в C++ 11. Но до этого обновления многопоточность может выполняться только в Qt только на C++. Итак,Многопоточность в чистом C++?

  1. Как Qt мог бы предоставить эту функциональность & не стандартный C++?
  2. Как люди многопоточили свои «чистые» C++ (без библиотек, таких как Qt, FLTK +) приложения? Меня интересуют люди, использующие компилятор MinGW.

ответ

5

Qt использует различные библиотеки потоков для разных операционных систем. Например, в Unix вы можете использовать pthreads, а в Windows вы можете использовать поддержку WinAPI (например, функцию CreateThread).

Например, Qt использует этот код для создания потока в системах Unix:

int code = 
    pthread_create(&d->thread_id, &attr, QThreadPrivate::start, this); 

и это создать его в системе Windows:

d->handle = (Qt::HANDLE) _beginthreadex(NULL, d->stackSize, QThreadPrivate::start, 
             this, CREATE_SUSPENDED, &(d->id)); 

Все это заворачивается с помощью препроцессора, так правильная библиотека используется для правильной системы. Посмотрите на этот код внутри qthread_p.h и все должно быть ясно, лет:

#ifdef Q_OS_UNIX 
    pthread_t thread_id; 
    QWaitCondition thread_done; 

    static void *start(void *arg); 
#if defined(Q_OS_SYMBIAN) 
    static void finish(void *arg, bool lockAnyway=true, bool closeNativeHandle=true); 
#else 
    static void finish(void *); 
#endif 

#endif // Q_OS_UNIX 

#if defined(Q_OS_WIN32) || defined(Q_OS_WINCE) 
    HANDLE handle; 
    unsigned int id; 
    int waiters; 

    static unsigned int __stdcall start(void *); 
    static void finish(void *, bool lockAnyway=true); 
#endif // Q_OS_WIN32 

Чтобы ответить на ваши вопросы:

  1. уже ответил. Поддержка потоков в реализациях C++ 11 реализована одинаково (с небольшой разницей - gcc не нуждается в поддержке потоков Win32, а Microsoft VC не нуждается в поддержке pthreads, если они написаны только для одной системы. Qt - мультиплатформенный библиотеки, поэтому необходимо включить поддержку всех платформ).

  2. Использование системных вызовов низкого уровня, таких как (pthread_create, CreateThread и т. Д.).

+0

Hi Nemanja, Спасибо за ваш быстрый ответ! Теперь я понимаю, что Qt использует библиотеки из ОС для многопоточности. Итак, в C++ 11 происходит то же самое? –

+0

@Cool_Coder да, стандартная библиотека должна использовать разные, специфичные для ОС, вызовы для поддержки потоков в разных системах. –

+0

Да, C++ 11 поместит onus на разработчика, чтобы предоставить библиотеки потоков, поддерживаемые собственной библиотекой ОС. –

2

Единственное, что делал Qt, это использовать разные библиотеки в зависимости от платформы. Стандартная библиотека также представляет собой набор библиотек, но с общим и хорошо определенным поведением и интерфейсами для всех платформ.

+0

Спасибо за ответ! –

+0

@Cool_Coder Я рад, что смогу помочь вам :), но избегайте подобных комментариев: http://meta.stackexchange.com/a/126184/222868. Если ответ был полезен для вас, отразите его с повышением. – Manu343726

+0

Вот один из меня! –

5

Как Qt может предоставить эту функциональность & не стандартный C++?

Это похоже на вопрос, как Qt может предоставить возможность отображения окон графического интерфейса, когда эта функция не предоставляется C++. Qt не реализуется исключительно с точки зрения стандартной библиотеки C++; Qt реализует принципиально новые функции, используя другие вещи.

Как люди многопоточили свои «чистые» C++ (без библиотек, таких как Qt, FLTK +) приложения? Меня интересуют люди, использующие компилятор MinGW.

До C++ 11 они этого не сделали. Им приходилось использовать другие библиотеки, такие как pthreads или специфичные для ОС библиотеки. На самом деле до модели памяти C++ 11 многопоточные программы были «неопределенным поведением» в соответствии со спецификацией.

+0

Спасибо за этот ответ. –

+0

* "до модели памяти C++ 11 многопоточные программы были« неопределенным поведением »в соответствии со спецификацией. *« Можете ли вы это объяснить? Модель памяти C++ делает многопоточные программы неопределенными? – Manu343726

+0

@ Manu343726. До C++ 11 модель памяти C++ не определяла поведение объектов, к которым обращались из нескольких потоков, поэтому поведение при этом не было определено. В результате спецификация C++ не налагала никаких требований на любую программу, которая сделала это. – bames53

Смежные вопросы