【发布时间】: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(&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(&mutex, NULL);实现了与使用初始化程序初始化互斥锁相同的结果,但它涉及可执行语句,并且对函数的调用本身必须在函数内部——它不能写在函数外部。这是标准术语。 -
使用
pthread_mutex_init(&mutex, NULL)从不声明任何东西——它调用之前声明的变量上的函数(你只能调用另一个函数内部的函数)。
标签: c synchronization pthreads mutex