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

时间:2015-04-30 11:16:17

标签: c++ multithreading

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

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

它是一种安全的应用,并且没有气味吗?

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

1 个答案:

答案 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;