pthread_once函数的简单示例
/*一次性初始化
int pthread_once(pthread_once_t *once_control, void (*init_routine) (void))
本函数使用初值为PTHREAD_ONCE_INIT的once_control变量保证init_routine()函数在本进程执行序列中仅执行一次。
例子:*/
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
pthread_once_t once = PTHREAD_ONCE_INIT; void once_run(void)
{
printf("once_run in thread %u\n ",(unsigned int )pthread_self());
} void * child1(void * arg)
{
pthread_t tid =pthread_self();
printf("thread: %u enter\n", tid);
pthread_once(&once,once_run);
printf("thread %u return\n", tid);
} void * child2(void * arg)
{
pthread_t tid =pthread_self();
printf("thread: %u enter\n", tid);
pthread_once(&once,once_run);
printf("thread %u return\n", tid);
} int main(void)
{
pthread_t tid1,tid2;
printf("hello\n");
pthread_create(&tid1,NULL,child1,NULL);
pthread_create(&tid2,NULL,child2,NULL);
sleep();
printf("main thread exit\n");
return ;
}
/*hello
thread: 3067763568 enter
once_run in thread 3067763568
thread 3067763568 return
thread: 3078253424 enter
thread 3078253424 return
main thread exit
*/
/*一次性初始化
有时候我们需要对一些posix变量只进行一次初始化,如线程键。如果我们进行多次初始化程序就会出现错误。
在传统的顺序编程中,一次性初始化经常通过使用布尔变量来管理。控制变量被静态初始化为0,而任何依赖于初始化的代码都能测试该变量。如果变量值仍然为0,则它能实行初始化,然后将变量置为1。以后检查的代码将跳过初始化。
但是在多线程程序设计中,事情就变的复杂的多。如果多个线程并发地执行初始化序列代码,可能有2个线程发现控制变量为0,并且都实行初始化,而该过程本该仅仅执行一次。
如果我们需要对一个posix变量静态的初始化,可使用的方法是用一个互斥量对该变量的初始话进行控制。但有时候我们需要对该变量进行动态初始化,pthread_once就会方便的多。*/
pthread_once函数的简单示例的更多相关文章
- ABAP分享一 弹出框函数的简单示例
在开发中经常会使用到弹出框这个功能,在SAP中有很多函数可以实现类似的功能,这里介绍一个比较简单常用的函数 POPUP_TO_CONFIRM 下面是一个实现的简单示例: TABLES sscrfie ...
- pthread_testcancel和pthread_cancel函数的简单示例
/*0.取消线程 int pthread_cancel(pthread_t thread); 设置取消点 void pthread_testcancel(void); 测试是否接收到取消请求,如果有, ...
- jquery函数$.proxy简单示例
来自于<jquery 权威指南> ------------------------------ <!DOCTYPE html PUBLIC "-//W3C//DTD XHT ...
- JavaScript 回调函数的简单示例
回调函数 回调函数也被称为高阶函数 所谓高阶函数,就是说值 函数作为参数被传递或者返回值输出 操作函数的函数称为 高阶函数 把一段可执行的代码(一个函数)作为参数传递给其他的代码(另一个函数),并在需 ...
- C++ 回调函数简单示例
回调函数其实就是以函数指针做函数参数传递给另一个函数,在另一个函数执行的时候可以根据函数指针执行回调函数的代码.简单示例,便于理解,防止遗忘. #include <iostream> ty ...
- Linux下的C Socket编程 -- server端的简单示例
Linux下的C Socket编程(三) server端的简单示例 经过前面的client端的学习,我们已经知道了如何创建socket,所以接下来就是去绑定他到具体的一个端口上面去. 绑定socket ...
- c语言中函数的简单介绍
c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数 int func() 3.有参 ...
- Swift学习之函数和简单地控件的创建
今天还是重复昨天做的事情--敲代码,但唯一的不同就是所学的知识不同了,我们又进一步往深得层次学习了,感觉越来越有意思了,虽然临近结束了看着大家积极性越来越低了,但是我知道我不能这样,我要比别人付出的 ...
- trait与policy模板应用简单示例
trait与policy模板应用简单示例 accumtraits.hpp // 累加算法模板的trait // 累加算法模板的trait #ifndef ACCUMTRAITS_HPP #define ...
随机推荐
- HDUOJ---1102Constructing Roads
Constructing Roads Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other ...
- PLSQL_标准删除的方式Delete/Drop/Truncate区别和比较(概念)
2014-06-02 Created By BaoXinjian
- DOA——MUSIC算法
一.均匀圆阵(UCA, Uniform Circular Array)的MUSIC算法 假设一个半径为R的M元均匀圆阵的所有阵元均位于坐标系X-Y平面内,第k-1个阵元坐标为,第i个窄带信号波长为,来 ...
- spring framework 4 源代码阅读(2)---从ClassPathXmlApplicationContext開始
Application初始化日志 15:23:12.790 [main] DEBUG o.s.core.env.StandardEnvironment - Adding [systemProperti ...
- 通达OA 在工作流中直接查询表单内容的开发尝试(图文)
一个朋友提出要在工作里直接查询表单内容的需求,原来他们把工作流当做业务系统来用.也算把工作流用到极致了.为了实现像软件里直接的查询功能,他想在办理工作流的时候直接能查询到表单里面的内容. 通过研究通达 ...
- CentOS 6.9升级GCC至7.3.0版本
1.查看当前centos版本: cat /etc/redhat-release 2. 安装centos6.9默认的开发工具,包含gcc,g++,make等等一系列工具: yum groupinsta ...
- JS教程:window.location使用方法的区别
介绍了window.location使用方法的区别. window.location.href=&http://www.jbxue.com/javascript/ldquo;url”:改变ur ...
- Spring 一二事(8) - annotation 形式的 MVC
<!-- component:把一个类放入到spring容器中,该类就是一个component 在base-package指定的包及子包下扫描所有的类 --> <context:co ...
- Xilinx之RAM使用指南
一. RAM 分类XILINX 的 RAM 可分为三种,分别是:单口 RAM,简化双口 RAM 和真双口 RAM.如下 图所示: 图1 单口 RAM 图2 简化双口 RAM A 口写入数据,B 口读数 ...
- linux 打包为zip压缩包
[root@nb linux学习]# zip -r dir.zip dir文件夹/ file文件 adding: dir文件夹/ (stored %) adding: file文件 (deflated ...