另外两个线程将相同的值写入相同的内存位置

时间:2014-04-09 10:17:57

标签: multithreading parallel-processing synchronization locking pthreads

我遇到多个线程将相同的值写入同一内​​存位置的情况。

这会导致内存位置存储由并发写入导致的损坏值吗?

让我们说我有一个具有唯一身份的A类对象。当线程使用它时,这些线程将为它们分配一个特定的ID,例如100.我的问题是:在所有线程将100写入此内存位置后,id是否可以是100以外的值?换句话说,我是否必须使用互斥锁来保护此ID?

2 个答案:

答案 0 :(得分:1)

简短回答:是的,保守并使用互斥锁保护您的关键部分。这样,您可以确保您的代码在每个可能的平台上都能正常运行。

答案 1 :(得分:1)

如果这两个条件成立,我认为相同值的多个非原子写保证是安全的(即产生与一次写相同的结果):

  • 非原子写入是由一系列原子写入构建的
  • 对位置的相同值的几个原子写入产生相同的值

这些似乎都很自然,但我不确定它们是否适用于所有可能的实现。

我想到的例子如下:

假设两个进程将2字节值1写入某个地址a。该值写为两个单独的原子字节:1到地址a0到地址a+1。现在,如果我们有两个流程(PQ),则首先将值1写入地址(比方说)10,然后写入值0要解决11,那么在没有相互排斥的情况下,我们会得到以下可能的执行:

  • P[1->10]P[0->11]Q[1->10]Q[0->11]
  • P[1->10]Q[1->10]P[0->11]Q[0->11]
  • P[1->10]Q[1->10]Q[0->11]P[0->11]
  • Q[1->10]Q[0->11]P[1->10]P[0->11]
  • Q[1->10]P[1->10]Q[0->11]P[0->11]
  • Q[1->10]P[1->10]P[0->11]Q[0->11]

无论哪种方式,我们都会将1两次写入位置10,并将0两次写入位置11原子位置。如果两次写入产生与一次写入相同的结果,则上述任一序列都会产生相同的结果。