我遇到多个线程将相同的值写入同一内存位置的情况。
这会导致内存位置存储由并发写入导致的损坏值吗?
让我们说我有一个具有唯一身份的A类对象。当线程使用它时,这些线程将为它们分配一个特定的ID,例如100.我的问题是:在所有线程将100写入此内存位置后,id是否可以是100以外的值?换句话说,我是否必须使用互斥锁来保护此ID?
答案 0 :(得分:1)
简短回答:是的,保守并使用互斥锁保护您的关键部分。这样,您可以确保您的代码在每个可能的平台上都能正常运行。
答案 1 :(得分:1)
如果这两个条件成立,我认为相同值的多个非原子写保证是安全的(即产生与一次写相同的结果):
这些似乎都很自然,但我不确定它们是否适用于所有可能的实现。
我想到的例子如下:
假设两个进程将2字节值1
写入某个地址a
。该值写为两个单独的原子字节:1
到地址a
,0
到地址a+1
。现在,如果我们有两个流程(P
,Q
),则首先将值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
原子位置。如果两次写入产生与一次写入相同的结果,则上述任一序列都会产生相同的结果。