Val*_*lea 26 c++ multithreading thread-safety unique-ptr c++11
unique_ptr线程安全吗?以下代码是否无法两次打印相同的数字?
#include <memory>
#include <string>
#include <thread>
#include <cstdio>
using namespace std;
int main()
{
unique_ptr<int> work;
thread t1([&] {
while (true) {
const unique_ptr<int> localWork = move(work);
if (localWork)
printf("thread1: %d\n", *localWork);
this_thread::yield();
}
});
thread t2([&] {
while (true) {
const unique_ptr<int> localWork = move(work);
if (localWork)
printf("thread2: %d\n", *localWork);
this_thread::yield();
}
});
for (int i = 0; ; i++) {
work.reset(new int(i));
while (work)
this_thread::yield();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Bar*_*ski 35
如果使用正确,unique_ptr是线程安全的.你打破了不成文的规则:你永远不会通过引用传递线程之间的unique_ptr.
unique_ptr背后的理念是它始终拥有一个(唯一的)所有者.因此,您可以始终在线程之间安全地传递它而不进行同步 - 但您必须按值传递它,而不是通过引用传递它.为unique_ptr创建别名后,您将失去唯一性属性,并且所有赌注均已关闭.不幸的是,C++不能保证唯一性,所以你要留下一个你必须遵循的惯例.不要为unique_ptr创建别名!
Use*_*ess 23
不,它不是线程安全的.
两个线程都可能move没有显式同步的工作指针,因此两个线程可能获得相同的值,或者两者都获得一些无效的指针...它是未定义的行为.
如果你想正确地做这样的事情,你可能需要使用类似的东西,std::atomic_exchange因此两个线程都可以用正确的语义读取/修改共享工作指针.
| 归档时间: |
|
| 查看次数: |
14157 次 |
| 最近记录: |