pthread_mutex_t的静态初始化

简介:

 初始化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.  

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


本文转自hipercomer 51CTO博客,原文链接:http://blog.51cto.com/hipercomer/938421



相关文章
|
4月前
|
存储 安全 NoSQL
pthread_getspecific和pthread_setspecific详解
pthread_getspecific和pthread_setspecific详解
|
4月前
|
存储 缓存 安全
C语言进程(第二章,wait,sleep,waitpid,pthread_mutex_lock,pthread_mutex_unlock)
C语言进程(第二章,wait,sleep,waitpid,pthread_mutex_lock,pthread_mutex_unlock)
32 0
|
8月前
|
C++
C++11/14/17中提供的mutex系列区别
C++11/14/17中提供的mutex系列类型如下:
|
10月前
|
Linux 编译器 C语言
互斥锁mutex
互斥锁mutex
49 0
pthread_mutex_unlock()出错
pthread_mutex_unlock()出错
104 0
Pthread线程使用详解
文中先讲解函数,再运行实例,以及一些注意事项
159 0
|
Linux API
pthread_mutex_init & 互斥锁pthread_mutex_t的使用
pthread_mutex_init l         头文件: #include l         函数原型: int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr); pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; l         函数作用: 该函数用于C函数的多线程编程中,互斥锁的初始化。
1824 0
|
C++
【C++ 语言】pthread_mutex_t 互斥锁
【C++ 语言】pthread_mutex_t 互斥锁
233 0