转自:http://hipercomer.blog.51cto.com/4415661/938421
非常感谢这位作者
初始化phtread_mutex_t类型的变量时有两种方法:一种为使用宏PTHREAD_MUTEX_INITIALIZER进行初始化,另外一种是使用函数pthread_mutex_init函数。第一种方法仅局限于静态初始化的时候使用:将“声明”、“定义”、“初始化”一气呵成,除此之外的情况都只能使用pthread_mutex_init函数。
下面是一段很简单的测试代码:
- /*
- * 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;
- }
编译后你会发现和上面呈现出一样的错误结果。