【pthread系列-9】pthread_mutex_t的静态初始化
来源:互联网 发布:小猫编程软件下载 编辑:程序博客网 时间:2024/06/10 19:40
初始化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;
- }
编译后你会发现和上面呈现出一样的错误结果。
- 【pthread系列-9】pthread_mutex_t的静态初始化
- pthread_mutex_t的静态初始化
- pthread_mutex_t的静态初始化
- 关于pthread_mutex_t的初始化
- 关于pthread_mutex_t的初始化
- 关于pthread_mutex_t的初始化
- 【转】关于pthread_mutex_t的初始化
- 初始化pthread_mutex_t变量的问题
- pthread_mutex_t的静态初始化 http://m.blog.csdn.net/blog/grantxx/8177130
- C++ 静态变量初始化(static pthread_mutex_t 初始化)
- linux下pthread_mutex_t 对象的初始化
- 【pthread系列-10】pthread的属性对象
- 多个用 PTHREAD_MUTEX_INITIALIZER 初始化的 pthread_mutex_t 不是同一个 mutex
- 【pthread系列-8】POSIX线程中的“一次初始化”
- 【pthread系列-4】使用多线程的利弊
- 【pthread系列-5】Pthreads线程的基本常识
- pthread多线程编程详细解析----条件变量 pthread_mutex_t
- 静态数据的初始化
- 【pthread系列-7】条件变量的接口函数和使用原则
- Google程序员转型产品经理经验分享
- 百度实习生招聘的一道大数据处理题目(上)
- 《UNIX网络编程》中第一个timer_server的例子
- 【pthread系列-8】POSIX线程中的“一次初始化”
- 【pthread系列-9】pthread_mutex_t的静态初始化
- C++中指针和引用的区别
- 【pthread系列-10】pthread的属性对象
- 【pthread系列-11】对Pthread线程进行简单的类封装
- win7下重新分区或者使用一键还原后不能进入ubuntu系统
- 门禁系统 随想
- 编译mysql5.1.68 make时候出现./include/my_global.h:1088: 错误:对 C++ 内建类型 ‘bool’ 的重声明
- 给UIImageview 添加边框 或者设置成圆角
- 为应用“瘦身”!给 Android 应用开发者的十个建议