初始化phtread_mutex_t类型的变量时有两种方法:一种为使用宏PTHREAD_MUTEX_INITIALIZER进行初始化,另一种是使用函数pthread_mutex_init函数。第一种方法仅局限于静态初始化的时候使用:将“声明”、“定义”、“初始化”一鼓作气,除此以外的状况都只能使用pthread_mutex_init函数。express
下面是一段很简单的测试代码:
- /*
- * main.c
- *
- * Created on: Jul 22, 2012
- * Author: lichao
- */
- #include "lc_error.h"
- #include <pthread.h>
- int main(int argc,char *argv[])
- {
- pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
- pthread_mutex_t mutex2;
- pthread_mutex_t mutex3;
- mutex3 = mutex1;
- mutex2 = PTHREAD_MUTEX_INITIALIZER;
- return 0;
- }
编译后提示如下错误:
- [lichao@sg01 mutex_init]$ make
- gcc -c -rdynamic -I. -I/u1/lichao/GPP/include/ -I/u1/lichao/include -o "main.o" "main.c"
- main.c: In function ‘main’:
- main.c:17: error: expected expression before ‘{’ token
- make: *** [main.o] Error 1
在声明定义Mutex变量的时候进行初始化正是所谓的静态初始化的过程,而将Mutex变量声明以后,在后面的某条语句中对该Mutex变量进行首次赋值则不是静态初始化过程,不能使用宏的方式进行初始化。
第16行中的Mutex变量赋值,虽然能经过编译,可是POSIX指出,这种赋值的结果是未定的,因此应该禁止这种用法。
静态初始化过程就是编译器在编译的过程当中完成了某些内存空间的初始化,也就是说这个初始化过程发生在编译时,而不是运行时,所以称之为静态初始化。PTHREAD_MUTEX_INITIALIZER 的完整定义为:
- # define PTHREAD_MUTEX_INITIALIZER \
- { { 0, 0, 0, 0, 0, 0, { 0, 0 } } }
因此,确切的说,17行的错误并非针对于Mutex变量,而是全部的结构体变量。结构体变量在使用常量进行总体初始化的时候只能在声明的时候进行,不能是声明结束以后。如下为一段简单的测试代码:
- /*
- * main.c
- *
- * Created on: Jul 22, 2012
- * Author: lichao
- */
- #include "lc_error.h"
- #include <pthread.h>
- typedef struct
- {
- int x,y;
- }point;
- int main(int argc,char *argv[])
- {
- pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
- pthread_mutex_t mutex2;
- pthread_mutex_t mutex3;
- mutex3 = mutex1;
- //mutex2 = PTHREAD_MUTEX_INITIALIZER;
- char * s;
- s = "1323";
- point x = {1,2};
- point y ;
- y = {3,4};
- return 0;
- }
编译后你会发现和上面呈现出同样的错误结果。