我知道之前有类似的问题被提出过,也知道这个操作很可能根本不是原子操作,但我还是出于好奇心和希望找到使其成为原子操作的方法而提出了这个问题。
情况如下:在一个结构体中,有一个名为"Busy"的无符号字符变量(它可以被移到其他位置并独立存在)。
这个变量"Busy"由两个并发线程修改,一个在线程调度时设置位,另一个在调度操作完成后清除位。
目前,调度操作看起来像这样:
当清除位掩码时,情况看起来像这样:
情况如下:在一个结构体中,有一个名为"Busy"的无符号字符变量(它可以被移到其他位置并独立存在)。
这个变量"Busy"由两个并发线程修改,一个在线程调度时设置位,另一个在调度操作完成后清除位。
目前,调度操作看起来像这样:
while(SEC.Busy&(1 << SEC.ReqID))
if(++SEC.ReqID == 5) SEC.ReqID = 0;
sQuery.cData[2] = SEC.ReqID;
当清除位掩码时,情况看起来像这样:
SEC.Busy &= ~(1 << sQuery->cData[2]);
cData [2] 基本上携带有关于网络中使用哪个插槽的信息,并通过另一个线程的回调返回。
现在问题是:如果可能的话,如何确保SEC.Busy(这是唯一的变量)在两个尝试同时更改它的线程中不会被分开而不使用互斥,临界区或类似物品?
我还尝试将SEC.Busy的内容分配给一个本地变量,然后更改该变量,然后再写回变量,但不幸的是,此操作似乎也不是原子操作。
目前我正在使用Borland C ++ Builder 6,但GCC解决方案也可以。
非常感谢。