我知道我可以使用信号量或互斥量和...,但是如果我在一个线程中写入一个变量并在另一个线程中读取它,我想知道是否有任何问题?像这样的东西:
#include <iostream>
#include <thread>
volatile int value=0;
int main()
{
auto workerThread = new std::thread([&]()
{
for(int i=0;i<10000;++i)
{
value=i;
std::this_thread::sleep_for(std::chrono::milliseconds(i*100));
}
}
);
while(true)
{
std::cout<<value<<std::endl;
if(value >1000) break;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
它是一种安全的应用,并且没有气味吗?
没有任何复杂性,我可以改进吗?
答案 0 :(得分:7)
不,这不是“安全”。
无论谁告诉你,volatile
是你需要保证安全的错误。
在互斥锁或信号量中包含对value
的访问权限,或将其设为std::atomic<int>
。
另请注意:
std::cout<<value<<std::endl;
if(value >1000) break;
每个人都可以阅读不同的价值。您可能只想阅读一次:
int v = value;
std::cout << v << std::endl;
if(v > 1000) break;