初始化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;
- }
編譯後你會發現和上面呈現出同樣的錯誤結果。