【问题标题】:Initialise mutex globally in C在C中全局初始化互斥锁
【发布时间】:2021-07-24 04:47:14
【问题描述】:

我有一些代码,其中两个 2 线程修改同一个变量的值,但具有两个不同的函数。所以我决定使用一个通用的互斥锁。那是为了:我全局初始化它:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>


#define perror_pthread(ret, msg) \
        do { errno = ret; perror(msg); } while (0)



pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;      /*define a mutex-object */ 
pthread_mutex_init(&mutex,NULL);  /*initialise this mutex object with default values */

我收到一条错误消息:

error: expected declaration specifiers or ‘...’ before ‘&’ token
 pthread_mutex_init(&mutex,NULL);  /*initialise this mutex object with default values */
                    ^

我不知道这是否是一个好习惯,但我觉得两个函数应该具有相同的互斥锁,以便在有锁时得到通知

【问题讨论】:

  • PTHREAD_MUTEX_INITIALIZER 背后的要点是以pthread_mutex_init(&amp;mutex, NULL); 初始化它的相同方式初始化互斥对象,但将其作为初始化程序而不是可执行语句。你不需要两者——任何一个都足够了。
  • 当您说“将其作为初始化程序而不是可执行语句执行”时,您能详细说明一下吗?我这样做是因为我认为第一个语句初始化了 pthread_mutex_t 类型的变量 mutex,而第二个语句以某种方式初始化了一个对象互斥锁......但这是我第一次尝试文档,所以我对一切都不确定
  • 在我看来,这类似于系统调用,例如 read,我们声明例如:char buf[1200] 然后我们编写类似 read(fd,buf,len(buf); 的东西,但此系统调用中的每个参数都是预先声明的。跨度>
  • 我的意思是pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 是一个初始化变量,而不是一个可执行语句。我的意思是pthread_mutex_t mutex; … pthread_mutex_init(&amp;mutex, NULL); 实现了与使用初始化程序初始化互斥锁相同的结果,但它涉及可执行语句,并且对函数的调用本身必须在函数内部——它不能写在函数外部。这是标准术语。
  • 使用pthread_mutex_init(&amp;mutex, NULL)从不声明任何东西——它调用之前声明的变量上的函数(你只能调用另一个函数内部的函数)。

标签: c synchronization pthreads mutex


【解决方案1】:

pthread_mutex_init 是一个函数,C 禁止文件范围内的表达式(即函数调用)。

要么使用静态初始化器,要么将pthread_mutex_init(...) 放入main() 的开头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    • 1970-01-01
    • 2012-06-05
    • 2021-09-01
    • 1970-01-01
    • 2013-01-15
    • 2017-06-19
    相关资源
    最近更新 更多