纯C++中的多线程
Multi threading in pure C++?
让我澄清一下,我知道 c++11 中添加了多线程支持。但在此更新之前,多线程只能在 Qt 中以 C++ 完成。所以
- Qt如何提供此功能而不是标准C++?
- 人们是如何多线程他们的"纯"C++(没有像Qt,FLTK+这样的库)应用程序?我对使用MinGW编译器的人感兴趣。
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,则不需要支持 pthreads。Qt是多平台库,因此需要包括对所有平台的支持)。
使用低级系统调用,如(
pthread_create
、CreateThread
等)。
Qt如何提供此功能而不是标准C++?
这类似于询问Qt如何在C++没有提供该功能时提供显示GUI窗口的能力。Qt并不是纯粹根据C++标准库实现的;Qt通过使用其他东西实现了根本性的新功能。
人们是如何多线程处理他们的"纯"C++(没有像Qt,FLTK+这样的库)应用程序?我对使用MinGW编译器的人感兴趣。
在C++11之前,他们没有。他们必须使用其他库,例如 pthreads 或特定于操作系统的库。事实上,在 C++11 内存模型之前,根据规范,多线程程序都是"未定义的行为"。
Qt唯一要做的就是根据平台使用不同的库。标准库也是一组库,但具有适用于所有平台的通用且指定良好的行为和接口。
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误