【问题标题】:Variable access in multiple threads with out synchronization不同步的多线程中的变量访问
【发布时间】:2011-09-15 09:03:57
【问题描述】:

我有以下代码

int i; //gobal var

Thread1:
{
...
  i=some value;
}

Thread2:
{
  if (i==2) dosomething();
  else dosomethingelse();
  i = 4;
}

我想在不使用同步对象的情况下以 C++ 标准方式将其编写为线程安全的。

我的问题是如何在不使用同步的情况下让不同线程读/写访问的变量?我的要求是有一个布尔变量,它可以是真或假。

易失性变量是原子的吗。

请注意,我不应该使用任何像 TBB 这样具有原子变量的库。

问这个问题的原因是我们不想在每次访问线程中的变量时都获取和释放信号量,因为这个变量不经常改变。

【问题讨论】:

  • 阅读 Boost Atomics 和 c++0x 线程规范。 @ 987654322@ sic,您想要的任何其他内容 :) - 您可以,对于安全的不同定义。如果模糊足够好并且您的代码可以处理偶尔读取“幻像”值,那么只要有一个写入器,您就不需要锁定。 (这可能对实时监控机制有用)。此外,如果变量不经常更改,它似乎是条件变量的良好候选者。
  • 你能用简单的例子展示如何在上述场景中使用条件变量。我的理解是条件变量阻塞而不是前进,但我想循环
  • 有多少线程正在读取变量,有多少线程可能改变它?
  • 只有两个线程,一个读一个写

标签: c++ multithreading synchronization


【解决方案1】:

你的代码现在没有任何意义。因为你基本上是在说`

Thread2:
{
  if (i==2) dosomething();
  //let's do something if i is 2 at the moment I am reading it.
  else dosomethingelse();
  i = 4;
}`

没关系。但是,如果您使用i 做某事,那么您就有麻烦了。 如果不是,并且如果您询问访问 i 是否是原子的,则取决于 cpu 架构。例如对于 x86 和 x64,它是原子的。阅读this。

【讨论】:

  • 实际上我只给出了我的项目中的简单代码,基本上我有两个线程,一个是阅读,另一个是写作
  • @venkysmarty:dosomething() 和 dosomethingelse 怎么样?他们是否使用全局变量i? dosomething() {std::cout << i << "\n";} ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多