纯 C++ 中的多线程?

Posted

技术标签:

【中文标题】纯 C++ 中的多线程?【英文标题】:Multi threading in pure C++? 【发布时间】:2013-09-12 16:38:17 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

回答您的问题:

    已经回答。 C++11 实现中的线程支持以相同的方式实现(略有不同 - gcc 不需要支持 Win32 线程,如果它们仅针对一个系统编写,Microsoft VC 也不需要支持 pthreads。Qt 是多平台的库,因此它需要包含对所有平台的支持)。

    使用低级系统调用,例如(pthread_createCreateThread 等)。

【讨论】:

嗨 Nemanja,感谢您的及时回复!现在我明白 Qt 使用来自操作系统的库进行多线程处理。那么在 C++11 中会发生同样的事情吗? @Cool_Coder 是的,标准库需要使用不同的、特定于操作系统的调用来支持不同系统上的线程。 是的,C++11 将赋予实现者提供由本机操作系统库支持的线程库的责任 因此,如果我在使用 MinGW 编译的纯 C++11 应用程序中进行多线程处理,我现在必须使用包含操作系统特定的头文件。现在生成的目标将在运行时自动获取所需的操作系统库(依赖项),还是我必须将它们与我的应用程序一起提供? 根据我过去的经验,MinGW 在没有发布 MS C++ Redistributables 的情况下运行良好。但这只是意味着 Windows XP 的构建应该可以在 Windows 7 和 8(反之亦然)上运行,并且您仍然需要在 Linux 或 OSX 上进行编译才能使其在其他操作系统上运行。【参考方案2】:

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

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

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

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

【讨论】:

感谢您的回答。 “根据规范,在 C++11 内存模型之前,多线程程序都是‘未定义行为’。”你能解释一下吗? C++内存模型让多线程程序有未定义行为? @Manu343726 在 C++11 之前,C++ 内存模型没有定义从多个线程访问的对象的行为,因此这样做的行为是未定义的。因此,C++ 规范对任何这样做的程序都没有要求。【参考方案3】:

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

【讨论】:

感谢您的回答! @Cool_Coder 我很高兴能帮助你:),但要避免这种 cmets:meta.stackexchange.com/a/126184/222868。如果某个答案对您有用,请点赞。

以上是关于纯 C++ 中的多线程?的主要内容,如果未能解决你的问题,请参考以下文章

c++ 中的多线程线程安全动画建议

C++中的多线程实现

C++中的多线程,只检查信号量是不是被锁定

C++中的多线程矩阵乘法

PySide 中的多线程提升 Python C++ 代码

C++多线程