gpt4 book ai didi

c++ - 以某种方式在 C++ 中错误地使用互斥锁

转载 作者:太空狗 更新时间:2023-10-29 19:46:49 26 4
gpt4 key购买 nike

我有以下代码尝试(但失败了)保护我代码中的关键区域。基本上,我希望在其他线程打印另一个语句之前,任何线程都可以完全执行打印语句。

main.h中:

pthread_mutex_t printer_mutex;

main.c 中 - 程序做的第一件事:

pthread_mutex_init(&printer_mutex, NULL);

线程是这样创建的(尽管我删除了一些检查):

for(long t = 0; t < NUM_THREADS; t++) {
args[t].fw = fw;
args[t].deriv_init = deriv_init;
args[t].to_prove = fw.to_prove.at(i);
pthread_create(&threads[t], NULL, do_derivation_helper, (void *) &args[t]);
}
for(long t = 0; t < NUM_THREADS; t++) {
pthread_join(threads[t], NULL);
}

然后在我的一个类中执行程序中的所有打印我有以下内容。打印应锁定,然后在完成后解锁。

void InfoViewer::rule_x_fires() {
// START CRITICAL REGION
pthread_mutex_lock(&printer_mutex);
cout << "INFO: Rule x fires" << endl;
pthread_mutex_unlock(&printer_mutex);
// END CRITICAL REGION
}

我得到的意外输出是:

INFO: Rule x firesINFO: Rule x fires

即该行不会在其他线程开始打印之前结束。

有什么想法吗?我没有正确初始化吗?我可以在我的 C++ 程序中使用标准 C 风格的线程吗?

最佳答案

我认为问题出在头文件中定义互斥量变量。这样每个编译单元都有自己的变量版本,你只需锁定不同的互斥量。只需这样做:

// .h header file: declare
extern pthread_mutex_t printer_mutex;

// one of the .c/.cpp files: define
pthread_mutex_t printer_mutex;

编辑0:

解释为什么它对多个定义“有效”——PThread mutex 可以用两种不同的方式初始化——动态地使用 pthread_mutex_init,静态地使用 PTHREAD_MUTEX_INITIALIZER。查看 pthread.h 可以找到以下内容(32 位版本):

# define PTHREAD_MUTEX_INITIALIZER \
{ { 0, 0, 0, 0, 0, { 0 } } }

这意味着任何 pthread_mutex_t 类型的静态变量都将被正确初始化,而无需分配任何显式值,或者由于静态内存是零填充的事实而调用 init 。因此,您明确地动态初始化了一个互斥锁,所有其他互斥锁都隐式初始化为全零。

关于c++ - 以某种方式在 C++ 中错误地使用互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6763891/

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