1

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

  1. Qt 如何提供这个功能而不是标准的 C++?
  2. 人们是如何对他们的“纯”C++(没有像 Qt、FLTK+ 这样的库)应用程序进行多线程处理的?我对使用 MinGW 编译器的人感兴趣。
4

3 回答 3

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 也不需要支持仅针对一个系统编写的 pthread。Qt 是多平台的库,因此它需要包含对所有平台的支持)。

  2. 使用低级系统调用,如 ( pthread_create, CreateThread, 等)。

于 2013-09-12T16:38:54.860 回答
5

Qt 如何提供这个功能而不是标准的 C++?

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

人们是如何对他们的“纯”C++(没有像 Qt、FLTK+ 这样的库)应用程序进行多线程处理的?我对使用 MinGW 编译器的人感兴趣。

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

于 2013-09-12T17:02:43.040 回答
2

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

于 2013-09-12T16:43:16.307 回答