Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能在一个线程中写入变量,并在C++中用另一个线程读取它吗?_C++_Multithreading - Fatal编程技术网

我能在一个线程中写入变量,并在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时。