我能在一个线程中写入变量,并在C++中用另一个线程读取它吗?
我知道我可以使用信号量或互斥和…,但我想知道如果我在一个线程中写入变量,在另一个线程中读取它,是否有任何问题?像这样的事情:我能在一个线程中写入变量,并在C++中用另一个线程读取它吗?,c++,multithreading,C++,Multithreading,我知道我可以使用信号量或互斥和…,但我想知道如果我在一个线程中写入变量,在另一个线程中读取它,是否有任何问题?像这样的事情: #include <iostream> #include <thread> volatile int value=0; int main() { auto workerThread = new std::thread([&]() { for(int i=0;i<10000;++i)
#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));
}
}
这是一个安全的应用程序,没有气味吗
没有任何复杂性,我可以改进它吗?不,它不安全
不管是谁告诉你,要保证安全,你需要的是挥发性物质,这是错误的
将对值的访问包装在互斥体或信号量中,或者将其设置为std::atomic
还请注意:
std::cout<<value<<std::endl;
if(value >1000) break;
可以分别读取不同的值。您可能只想阅读一次:
int v = value;
std::cout << v << std::endl;
if(v > 1000) break;
谢谢,如果我们忘记了读取的值,可能会写入不同的值,但读取方式不同,应用程序是否有崩溃的可能?如果为什么?@mans:拿起一本关于并发编程的书。这里不是进行并发性入门讲座的地方。@mans:它可以做任何事情,非同步非原子访问具有未定义的行为。在x86上,这种特定的读取永远不会崩溃,但它很容易使您的应用程序由于意外值而崩溃,或者仅仅一个微小的更改就可能导致UB,例如,以这种方式使用bool时。