我很清楚以前曾问过类似的问题,而且我也知道,该操作很可能根本不是原子的,但我仍然出于好奇而询问,并希望有某种方法可以使它成为原子的.
情况:在 astruct
中,有一个 unsigned char 变量,称为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 解决方案也可以。
非常感谢你。