【发布时间】:2018-11-18 22:53:36
【问题描述】:
在共享文件中声明和定义一个结构。
由 Windows API CreateThread() 创建的两个线程都可以看到它的实例:
struct info
{
std::atomic<bool> inUse;
string name;
};
info userStruct; //this guy shared between two threads
线程 1 不断锁定/解锁以 写入 到结构中的成员(测试值相同):
while (1)
{
userStruct.inUse = true;
userStruct.name= "TEST";
userStruct.inUse = false;
}
线程 2 只是读取和打印,只有当它碰巧发现它解锁时
while (1)
{
while (! userStruct.inUse.load() )
{
printf("** %d, %s\n\n", userStruct.inUse.load(), userStruct.name.c_str());
Sleep(500); //slower reading
}
printf("In Use!\n");
}
期待看到很多:
“正在使用中!”
如果它进入,每次解锁时:
“0,测试”
..确实如此。
但也看到了:
“1,测试”
如果 atomic bool 是 1,我不希望看到它。
我做错了什么?
【问题讨论】:
-
您正在对原子变量执行 2 次分离加载以检查然后输出。该值可以在负载之间变化
-
@tyker:好的,我明白了,那么在打印之前再次锁定它并在打印之后解锁是正确的使用方法吗?谢谢。
-
@P.S. en.cppreference.com/w/cpp/atomic/atomic_compare_exchange 是要走的路。它以原子方式比较和更新原子变量。
-
抱歉,链接错误。使用 atomic 的成员方法:en.cppreference.com/w/cpp/atomic/atomic/compare_exchange
-
@P.S.发表了答案,请随时提出任何问题。:)
标签: c++ windows multithreading atomic