我可以在一个线程中写入变量并在 c++ 中的另一个线程中读取它吗?

Can I write to a variable in a thread and read it in another thread in c++

本文关键字:线程 c++ 另一个 读取 一个 我可以 变量      更新时间:2023-10-16

我知道我可以使用信号量或互斥锁和...,但是我想知道如果我在一个线程中写入变量并在另一个线程中读取它是否有任何问题? 像这样的东西:

#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));
     }
}

它是一个安全的应用程序并且没有气味吗?

没有任何复杂性,我可以改进它吗?

不,它不是"安全的"。

谁告诉你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;