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



相关文章
|
JavaScript 前端开发 API
从架构到API,你真的掌握了Electron的全貌吗?
本文首发于微信公众号“前端徐徐”。作者徐徐从架构层面、协作方式、底层支持、源码层面及API设计等方面剖析了Electron的原理。通过分析Electron的核心组件(Chromium和Node.js)、进程隔离、上下文桥接及IPC机制等内容,揭示了Electron在设计上的精妙之处及其对开发高效、稳定桌面应用的重要性。了解这些原理有助于开发者更好地设计和解决问题。
1365 2
从架构到API,你真的掌握了Electron的全貌吗?
|
Linux Go SoC
关于S3学习所涉及到的知识(二):Linux设备驱动suspend/resume的顺序
关于S3学习所涉及到的知识(二):Linux设备驱动suspend/resume的顺序
1215 0
|
10月前
|
数据采集 数据挖掘 Serverless
空间转录组学: 质控处理(1)
空间转录组学: 质控处理(1)
空间转录组学: 质控处理(1)
|
10月前
|
运维 数据可视化 Cloud Native
从 Bitnami 镜像到 Websoft9 平台:可视化集中管理的价值不可估量
在云原生与容器化尚未普及的年代,Bitnami 曾凭借预配置镜像解决部署难题,但随着技术演进,其局限性逐渐显现。部署只是开始,运维才是长期挑战。Websoft9 提供从部署到运维的全生命周期管理,通过可视化控制台、自动证书、系统巡检等功能,实现运维可控、可预期、可节省,成为 Bitnami 的理想接班者。
210 0
从 Bitnami 镜像到 Websoft9 平台:可视化集中管理的价值不可估量
|
监控 Java API
Java 异步编程难题拆解实操指南:从入门到精通解决异步编程关键问题
本文深入探讨了Java异步编程的实操技巧,基于Project Reactor与Spring WebFlux等技术框架,通过具体案例解决常见难题。内容涵盖反应式编程基础、回调地狱解决方案、并行任务处理、响应式REST API开发、背压策略应用、微服务异步通信及性能监控等方面。结合代码示例,详细讲解了如何构建高性能异步应用,并总结了最佳实践,帮助开发者掌握异步编程的核心技能。适合希望提升异步开发能力的技术人员阅读。
438 3
|
存储 编译器 C语言
C语言:数组名作为类型、作为地址、对数组名取地址的区别
在C语言中,数组名可以作为类型、地址和取地址使用。数组名本身代表数组的首地址,作为地址时可以直接使用;作为类型时,用于声明指针或函数参数;取地址时,使用取地址符 (&),得到的是整个数组的地址,类型为指向该类型的指针。
1453 4
|
机器学习/深度学习 人工智能 边缘计算
高算力服务器的应用场景
【10月更文挑战第18天】高算力服务器作为现代信息社会不可或缺的计算资源,正广泛应用于各行各业。从人工智能到科学研究,从智能交通到数字孪生,它为复杂的计算任务提供了不可替代的支持。
977 0
|
Kubernetes 应用服务中间件 nginx
Kubernetes(k8s)容器编排Pod介绍和使用
Kubernetes(k8s)容器编排Pod介绍和使用
676 0
|
安全 物联网 数据安全/隐私保护
物联网卡的一些限制条件
在选择物联卡时,确实需要注意一些限制条件,以确保物联卡的正常使用和满足设备的需求。以下是一些常见的限制条件:
|
C语言
【C语言基础篇】数组传参规则详解
【C语言基础篇】数组传参规则详解

热门文章

最新文章