繁体   English   中英

C ++ 11互斥是否与非C ++ 11创建的线程兼容?

[英]Is a C++11 mutex compatible with threads NOT created with C++11?

我正在学习C ++ 11并且遇到了线程问题。 我的一般问题:C ++ 11互斥体是否与非C ++ 11标准库创建的线程兼容?

我想安全地在用C ++ 11创建的线程和由我无法控制的第三方库创建的另一个线程之间共享信息。

例如,我的应用程序使用PortAudio,它为音频输出创建自己的线程。 我不确定它是使用pthreads还是特定于OS的线程库,但我知道PortAudio不是用C ++ 11编写的。 我想安全地在GUI线程(使用C ++ 11线程)和使用互斥锁的PortAudio线程之间共享数据。

同样,我可以使用C ++ 11互斥锁来同步QT QThreads和C ++ 11线程吗?

C ++ 11互斥体是否与非C ++ 11标准库创建的线程兼容?

C ++标准没有将“线程”定义为C ++标准库专门创建的东西。

1.10多线程执行和数据竞争[intro.multithread]

1执行线程(也称为线程)是程序中的单个控制流,包括特定顶级函数的初始调用,并递归地包括随后由线程执行的每个函数调用。

所以,我会得出结论,你的问题的答案是肯定的。

显然,C ++标准不保证与其他系统的兼容性。 C和C ++标准添加线程设施的部分原因是在一个线程系统上进行标准化。

在实践中,期望C和C ++线程库被构建为与平台线程系统集成(如果有的话)。 例如,在使用pthreads的平台上,期望在适当的地方使用pthread来构建标准库线程设施(据我所知,各种原子操作没有pthreads接口,即标准库可能需要提供自己的同步原语)。

标准库类通过native_handle()方法提供对底层表示的访问。 标准库应该实现从这些返回的内容,例如,如果提供了pthreads类型,似乎可以安全地假设这个特定的标准库将与pthreads一起使用。

C ++ 11标准规定互斥锁应该与任何类型的“执行代理”一起使用,包括不同的线程库。 以下是该标准的一些相关引用,我认为最终可以回答这个问题:

互斥要求

互斥对象有助于防止数据争用,并允许执行代理之间的数据安全同步(30.2.5)。 执行代理在成功调用其中一个锁定函数之前拥有一个互斥锁,直到它调用unlock。

可锁定类型的要求

执行代理是诸如可以与其他执行代理并行执行工作的线程之类的实体。 [注意:实现或用户可能会引入其他类型的代理,例如进程或线程池任务。 -end note]调用代理由上下文确定,例如包含调用的调用线程,等等。

不可思议的是,C ++ 11的线程实现将与平台的本机线程实现不兼容,因为任何使用C ++ 11线程的实际程序都将调用平台库,这些库本身可能是线程化的或与线程相关的调用(以互斥为例)。

线程的C ++ 11库实现当然不必使用高级本机线程库(例如,pthreads或windows线程),但它可能会出于某种目的,如上所述,有一个std :: thread: :native_handle()方法获取本机句柄。 但是,即使它不使用高级本机实现,它也必须在下面使用相同的低级内核原语。

因此,在所有可能的情况下,将C ++ 11互斥锁与本机库调用创建的线程实例一起使用应该是完全安全的,反之亦然,并混合任何其他本机或C ++库同步调用。 确实可能存在必须这样做的情况。 例如,C ++ 11库目前不提供线程池或读写锁(共享互斥锁)。 您可能希望对使用std :: thread启动的线程使用本机读写锁,或者使用C ++程序中第三方库提供的众多线程池实现之一。

需要注意的唯一需要注意的是,尝试将C ++ 11线程(实际上必须以某种方式使用内核线程,出于上述原因)与不使用内核线程的线程库混合(对于例如,基于绿色线程或“用户”线程的库,可能会让您陷入困境。

编辑:为了支持这一点,我注意到C ++ 11的§30.3,尽管是非规范性的,但是“这些线程[std :: thread threads]旨在与操作系统线程一对一映射”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM