pthread_mutex_t的静态初始化

转自:http://hipercomer.blog.51cto.com/4415661/938421

非常感谢这位作者

初始化phtread_mutex_t类型的变量时有两种方法:一种为使用宏PTHREAD_MUTEX_INITIALIZER进行初始化,另外一种是使用函数pthread_mutex_init函数。第一种方法仅局限于静态初始化的时候使用:将“声明”、“定义”、“初始化”一气呵成,除此之外的情况都只能使用pthread_mutex_init函数。

下面是一段很简单的测试代码:

 

 
 
  1. /* 
  2.  
  3.  * main.c 
  4.  
  5.  * 
  6.  
  7.  *  Created on: Jul 22, 2012 
  8.  
  9.  *      Author: lichao 
  10.  
  11.  */ 
  12.  
  13.   
  14.  
  15. #include "lc_error.h" 
  16.  
  17. #include <pthread.h> 
  18.  
  19.   
  20.  
  21. int main(int argc,char *argv[]) 
  22.  
  23.  
  24.       pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 
  25.  
  26.       pthread_mutex_t mutex2; 
  27.  
  28.       pthread_mutex_t mutex3; 
  29.  
  30.       mutex3 = mutex1; 
  31.  
  32.       mutex2 = PTHREAD_MUTEX_INITIALIZER; 
  33.  
  34.       return 0; 
  35.  

编译后提示以下错误:

 

 
 
  1. [lichao@sg01 mutex_init]$ make 
  2.  
  3. gcc -c -rdynamic -I.  -I/u1/lichao/GPP/include/ -I/u1/lichao/include -o "main.o" "main.c" 
  4.  
  5. main.c: In function ‘main’: 
  6.  
  7. main.c:17: error: expected expression before ‘{’ token 
  8.  
  9. make: *** [main.o] Error 1 

在声明定义Mutex变量的时候进行初始化正是所谓的静态初始化的过程,而将Mutex变量声明之后,在后面的某条语句中对该Mutex变量进行首次赋值则不是静态初始化过程,不能使用宏的方式进行初始化。

第16行中的Mutex变量赋值,虽然能通过编译,但是POSIX指出,这种赋值的结果是未定的,所以应该禁止这种用法。

静态初始化过程就是编译器在编译的过程中完成了某些内存空间的初始化,也就是说这个初始化过程发生在编译时,而不是运行时,因此称之为静态初始化。PTHREAD_MUTEX_INITIALIZER 的完整定义为:

 

 
 
  1. # define PTHREAD_MUTEX_INITIALIZER \ 
  2.  
  3.   { { 0, 0, 0, 0, 0, 0, { 0, 0 } } } 

所以,确切的说,17行的错误并不是针对于Mutex变量,而是所有的结构体变量。结构体变量在使用常量进行整体初始化的时候只能在声明的时候进行,不能是声明结束之后。以下为一段简单的测试代码:

 

 
 
  1. /* 
  2.  
  3.  * main.c 
  4.  
  5.  * 
  6.  
  7.  *  Created on: Jul 22, 2012 
  8.  
  9.  *      Author: lichao 
  10.  
  11.  */ 
  12.  
  13.   
  14.  
  15. #include "lc_error.h" 
  16.  
  17. #include <pthread.h> 
  18.  
  19.   
  20.  
  21. typedef struct 
  22.  
  23.  
  24.       int x,y; 
  25.  
  26. }point; 
  27.  
  28. int main(int argc,char *argv[]) 
  29.  
  30.  
  31.       pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 
  32.  
  33.       pthread_mutex_t mutex2; 
  34.  
  35.       pthread_mutex_t mutex3; 
  36.  
  37.       mutex3 = mutex1; 
  38.  
  39.       //mutex2 = PTHREAD_MUTEX_INITIALIZER; 
  40.  
  41.       char * s; 
  42.  
  43.       s = "1323"
  44.  
  45.       point x = {1,2}; 
  46.  
  47.       point y ; 
  48.  
  49.       y = {3,4}; 
  50.  
  51.       return 0; 
  52.  

编译后你会发现和上面呈现出一样的错误结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值