gpt4 book ai didi

c - 解决信号量初始化期间的竞争条件

转载 作者:太空宇宙 更新时间:2023-11-04 07:32:26 24 4
gpt4 key购买 nike

我有一个必须在线程之间共享的数组,由信号量保护。我把初始化代码放在了一个可以多次调用的函数里面,一个“构造函数”,如下:

#include <stdbool.h> //for bool
#include <semaphore.h>

sem_t global_mutex;
char global_array[N]; // Protected with global_mutex

struct my_struct *new_my_struct(){
static bool is_init = false; // This will be initialized only once, right?
if (!is_init){ // 1
sem_init(&global_mutex, 0, 1); // 2
sem_wait(&global_mutex); // 3
if (!is_init){ // 4
is_init = true; // 5
... initialize global_array ... // 6
}
sem_post(&global_mutex); // 7
}

... proceed on the create and return a my_struct pointer ...
}

在理想世界中,线程将从 1 运行到 7,初始化数组并退出临界区。即使另一个线程在 2 中停止,4 中的测试也将是错误的并且数组不会被覆盖。我没有想太多如果一个线程卡在 1 并重新初始化信号量会发生什么,但我相信这不是什么大问题 只要 is_init 被设置为 true第一个运行的线程!

现在,如果一个线程在 4 中停止,而另一个线程从开始运行到完成,初始化并填充 global_array,则存在竞争条件。当线程运行到第 4 次时停止,它会重新初始化数组并删除第一个线程存储的状态。

我想知道是否有任何方法可以避免这种竞争条件(也许是 static 的巧妙使用?)或者我是否应该将初始化代码与构造函数分开并在主线程,当没有并发时。

此代码正在使用中,我还没有遇到竞争条件。但是,据我所知,我希望更正它。

最佳答案

如果信号量的真正用途是作为互斥体,那么只使用pthread_mutex_t。这些可以静态初始化,这样您的问题就会消失。

语法是

pthread_mutex_t global_mutex = PTHREAD_MUTEX_INITIALIZER;

如果您确实需要全局对象的动态初始化,请查看pthread_once。这是 POSIX 为此类任务预见的类型 (pthread_once_t) 和函数。

关于c - 解决信号量初始化期间的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12458620/

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