加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:19:45 所属栏目:百科 来源:网络整理
导读:我有以下代码尝试(和失败)来保护我的代码中的关键区域.基本上我想在任何其他线程打印另一个语句之前由任何线程完全执行print语句. 在main.h中: pthread_mutex_t printer_mutex; 在main.c中 – 程序的第一件事: pthread_mutex_init(printer_mutex,NULL); 线
我有以下代码尝试(和失败)来保护我的代码中的关键区域.基本上我想在任何其他线程打印另一个语句之前由任何线程完全执行print语句.

在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互斥锁 – 使用pthread_mutex_init动态创建,并使用PTHREAD_MUTEX_INITIALIZER静态地初始化.查看pthread.h,可以找到以下内容(32位版本):

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

这意味着任何类型为pthread_mutex_t的静态变量都将被正确初始化,而不会分配任何显式值,或者由于静态内存为零填充而导致初始化.因此,您显式动态初始化了一个互斥锁,其他所有互斥锁都被隐式初始化为全零.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读