我想初始化大量的互斥对象来同步线程。
以下语法导致循环中出现构建错误"Expected expression"
:
pthread_mutex_t *mtxs = malloc(MAX * sizeof(pthread_mutex_t));
for (size_t i=0; i<MAX; i++) {
mtxs[i] = PTHREAD_MUTEX_INITIALIZER;
}
我还尝试使用指针算术而不是数组:
*(mtxs+i) = PTHREAD_MUTEX_INITIALIZER;
但是得到相同的错误。
然而,以下代码使用2个步骤而不是1个步骤进行初始化,效果良好:
pthread_mutex_t *mtxs = malloc(MAX * sizeof(pthread_mutex_t));
for (size_t i=0; i<MAX; i++) {
pthread_mutex_t tmp = PTHREAD_MUTEX_INITIALIZER;
mtxs[i] = tmp;
}
为什么"1步"初始化会导致生成错误,而"2步"运行良好?
对于一步初始化,是否有不同的语法可以工作?
从手册页,
在默认互斥属性合适的情况下,宏PTHREAD_mutex_INITIALIZER可用于初始化静态分配的互斥。该效果应等效于通过调用参数
attr
指定为NULL的pthread_mutex_init()
进行的动态初始化,但不执行任何错误检查。
初始化变量时只能使用PTHREAD_MUTEX_INITIALIZER
。它不能在作业中使用。
两者均使用=
,
mtxs[i] = PTHREAD_MUTEX_INITIALIZER;
是一个由赋值和组成的表达式
pthread_mutex_t tmp = PTHREAD_MUTEX_INITIALIZER;
是一个带有初始值设定项的变量声明。有些类型的变量(例如数组(可以初始化,但我们无法将其赋值。
此外,初始化程序的语法与赋值右侧所允许的语法不同。PTHREAD_MUTEX_INITIALIZER
在赋值的右侧可能无效。
在失败的代码中,您在赋值中使用PTHREAD_MUTEX_INITIALIZER
,而它只能在初始值设定项中使用。请使用以下内容:
pthread_mutex_init(mtxs+i, NULL);