纯C ++中的多线程?

时间:2013-09-12 16:38:17

标签: c++ multithreading qt c++11 mingw

让我澄清一下,我知道在c ++ 11中添加了多线程支持。 但在此更新之前,多线程只能在Qt中用C ++完成。所以,

  1. Qt如何提供此功能&不是标准的C ++?
  2. 人们如何多线程化他们的'纯'C ++(没有像Qt,FLTK +这样的库)应用程序? 我对使用MinGW编译器的人感兴趣。

3 个答案:

答案 0 :(得分:5)

Qt对不同的操作系统使用不同的线程库。例如,在Unix上,您可以使用pthread,在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也不需要支持pthread。问题是多平台库需要包含对所有平台的支持。

  2. 使用(pthread_createCreateThread等低级别系统调用。

答案 1 :(得分:5)

  

Qt如何提供此功能&不是标准的C ++?

这类似于询问Qt如何在C ++未提供该功能时提供显示GUI窗口的能力。 Qt并不是纯粹根据C ++标准库实现的; Qt通过使用其他东西来实现基本的新功能。

  

人们如何多线程化他们的'纯'C ++(没有像Qt,FLTK +这样的库)应用程序?我对使用MinGW编译器的人感兴趣。

在C ++ 11之前,他们没有。他们必须使用其他库,如pthreads或OS特定库。事实上,根据规范,在C ++ 11内存模型之前,多线程程序都是“未定义的行为”。

答案 2 :(得分:2)

Qt唯一要做的就是根据平台使用不同的库。标准库也是一组库,但具有适用于所有平台的通用且良好指定的行为和接口。