pthread_mutex_t的静态初始化 http://m.blog.csdn.net/blog/grantxx/8177130
来源:互联网 发布:数学网络课程哪个好 编辑:程序博客网 时间:2024/06/06 00:02
[转]pthread_mutex_t的静态初始化
2012-11-13阅读312 评论0
转自: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;
- }
编译后你会发现和上面呈现出一样的错误结果。
0 1
- pthread_mutex_t的静态初始化 http://m.blog.csdn.net/blog/grantxx/8177130
- http://m.blog.csdn.net/blog/Diwat/12616005
- 转载自http://m.blog.csdn.net/blog/tylanbin/18766171
- sched_setscheduler用法 http://m.blog.csdn.net/blog/manshq163com/7717209
- http://m.blog.csdn.net/blog/jimy86022/20995481 [zhuanzai] -------celllinehidden
- uCosii的OSInit();函数分析 转自匿名http://m.blog.csdn.net/blog/songhengli/19939469
- [原]fclose(stdout)和close(1)的区别 http://m.blog.csdn.net/blog/wangzuxi_11109/43445599
- http://blog.csdn.net/
- http://blog.csdn.net
- Linux线程-互斥锁pthread_mutex_t http://blog.csdn.net/zmxiangde_88/article/details/7998458
- http://m.blog.csdn.net/article/details?id=46348827
- 我的blog地址是 http://blog.csdn.net/asign
- http://blog.csdn.net/baggio785/不错的blog内容丰富啊
- 我的子blog: http://blog.csdn.net/BBsync
- Java classpath的作用 http://m.blog.csdn.net/article/details?id=43155707
- webview详解 转载地址http://m.blog.csdn.net/blog/qeqeqe236/7951409
- java面经http://m.blog.csdn.net/blog/index?username=sadjladjlas
- pthread_mutex_t的静态初始化
- eas bos editUI 刷新方法 帮助类
- Symfony 路由
- shell脚本-if内判断
- mysql安装
- linux的mysql数据库的由于权限问题看不到mysql库user表
- pthread_mutex_t的静态初始化 http://m.blog.csdn.net/blog/grantxx/8177130
- Xcode常用快捷键
- Android线程操作类(暂停、重新开启、停止)
- 两个div并排解决办法
- VIM中将tab转换为空格
- release与debug应用
- Java for Web学习笔记(七):Servlet(5)初始化参数
- CocoaPods介绍-安装-使用
- 反向代理(一)