gpt4 book ai didi

c++ - 使对 unsigned char 线程安全(原子)的访问

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:43 24 4
gpt4 key购买 nike

我很清楚以前有人问过类似的问题而且我也知道,该操作很可能根本不是原子的,但我仍然出于好奇而问,希望有某种方法可以使其成为原子。

情况:在 struct 中,有一个名为 Busy 的 unsigned char 变量。 (尽管它可以移出那里并独立站立)。

此变量 Busy 由两个并发线程修改,一个在调度时设置位,另一个在完成预定操作后清除它们。

现在,调度看起来像这样:

while(SEC.Busy&(1 << SEC.ReqID))
if(++SEC.ReqID == 5) SEC.ReqID = 0;
sQuery.cData[2] = SEC.ReqID;

虽然清除 bitmaks 看起来像这样:

SEC.Busy &= ~(1 << sQuery->cData[2]);

cData[2] 基本上携带有关网络上使用了哪个插槽的信息,并通过另一个线程中的回调返回。

现在的问题是:我如何确保 SEC.Busy(这是这种麻烦情况下的唯一变量)不会被两个试图在不使用互斥锁的情况下同时更改它的线程撕裂,关键部分或类似内容(如果可能)?

我也试过将 SEC.Busy 的内容分配给一个局部变量,改变它然后写回变量,但不幸的是这个操作似乎也不是原子的。

我目前使用的是 Borland C++ Builder 6,不过 GCC 解决方案也不错。

非常感谢。

最佳答案

C++03(也不是 C99)根本没有提及原子性。 赋值在大多数平台上是原子的(=每个人都看到旧值或新值),但因为它不是同步的(=任何人在看到其他更新的新值后可能会看到旧值) any,反正也没用。任何其他操作,如递增、设置位等,甚至可能都不是原子操作。

C++11 定义了 std::atomic template ,它既保证了原子性又保证了同步,所以你需要使用它。 Boost 为大多数 C++03 编译器和 gcc 提供了兼容的实现 has had built-in support since 4.2 , 被 more advanced support needed by C++11 in gcc 4.7 取代

Windows API 有 "Interlocked operations"从很久以前。在引入 gcc __sync 函数之前,Unix 替代方案需要汇编(有几个库提供)。

关于c++ - 使对 unsigned char 线程安全(原子)的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16893261/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com