- 浏览: 146495 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lyaqys:
lz实现的OptimisticExclusiveLock有点问 ...
java park/unpark 【java并发】基于JUC CAS原理,自己实现简单独占锁
《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在阅读此书的时候,将书上的代码按照自己的理解重写了一遍(大部分是抄书上的),加深一下自己的理解(纯看书太困了,呵呵)。此例子在Ubuntu10.04上测试通过。
程序简介:多线程的进程通过fork函数创建子进程时,如果要清除各种锁的状态,可以通过调用pthread_atfork函数建立fork处理程序。
//《APUE》程序12-7:pthread_atfork实例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>
pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;
void prepare(void)
{
printf("preparing locks...\n");
pthread_mutex_lock(&lock1);
pthread_mutex_lock(&lock2);
}
void parent(void)
{
printf("parent unlocking locks...\n");
pthread_mutex_unlock(&lock1);
pthread_mutex_unlock(&lock2);
}
void child(void)
{
printf("child unlocking locks...\n");
pthread_mutex_unlock(&lock1);
pthread_mutex_unlock(&lock2);
}
void *thr_fn(void *fn)
{
printf("thread started...\n");
pause();
return 0;
}
int main(void)
{
pid_t pid;
pthread_t tid;
//BSD系统和MAC OS系统不支持pthread_atfork
#if defined(BSD) || defined(MACOS)
printf("pthread_atfork is unsupported\n");
#else
//见注解2
pthread_atfork(prepare, parent, child);
pthread_create(&tid, NULL, thr_fn, NULL);
sleep(2);
printf("parent about to fork...\n");
pid = fork();
if( 0 == pid )
printf("child returned from fork\n");
else
printf("parent returned from fork\n");
#endif
return 0;
}
运行示例(红色字体的为输入):
www.linuxidc.com @ubuntu:~/code$ gcc temp.c -lpthread -o temp
www.linuxidc.com @ubuntu:~/code$ ./temp
thread started...
parent about to fork...
preparing locks...
parent unlocking locks...
parent returned from fork
child unlocking locks...
child returned from fork
注解:
1:父进程通过fork创建了子进程。子进程不但继承了父进程整个地址空间的副本,也继承了所有的互斥量,读写锁和条件变量的状态,如果父进程包含多个线程,子进程在fork返回之后,如果不是紧接着使用exec的话,就要清理锁状态。
2:pthread_atfork最多可以安装三个帮助清理锁的函数。prepare函数将在fork创建子进程之前被调用,通常可以用来获取进程中的所有锁;parent在fork创建子进程后返回前在父进程中被调用,可以用来释放父进程中的锁;child在fork创建子进程后fork返回前在子进程中被调用,可以用来释放子进程中的锁。给这三个参数传递NULL,表示不调用该函数。
程序简介:多线程的进程通过fork函数创建子进程时,如果要清除各种锁的状态,可以通过调用pthread_atfork函数建立fork处理程序。
//《APUE》程序12-7:pthread_atfork实例
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <pthread.h>
pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;
void prepare(void)
{
printf("preparing locks...\n");
pthread_mutex_lock(&lock1);
pthread_mutex_lock(&lock2);
}
void parent(void)
{
printf("parent unlocking locks...\n");
pthread_mutex_unlock(&lock1);
pthread_mutex_unlock(&lock2);
}
void child(void)
{
printf("child unlocking locks...\n");
pthread_mutex_unlock(&lock1);
pthread_mutex_unlock(&lock2);
}
void *thr_fn(void *fn)
{
printf("thread started...\n");
pause();
return 0;
}
int main(void)
{
pid_t pid;
pthread_t tid;
//BSD系统和MAC OS系统不支持pthread_atfork
#if defined(BSD) || defined(MACOS)
printf("pthread_atfork is unsupported\n");
#else
//见注解2
pthread_atfork(prepare, parent, child);
pthread_create(&tid, NULL, thr_fn, NULL);
sleep(2);
printf("parent about to fork...\n");
pid = fork();
if( 0 == pid )
printf("child returned from fork\n");
else
printf("parent returned from fork\n");
#endif
return 0;
}
运行示例(红色字体的为输入):
www.linuxidc.com @ubuntu:~/code$ gcc temp.c -lpthread -o temp
www.linuxidc.com @ubuntu:~/code$ ./temp
thread started...
parent about to fork...
preparing locks...
parent unlocking locks...
parent returned from fork
child unlocking locks...
child returned from fork
注解:
1:父进程通过fork创建了子进程。子进程不但继承了父进程整个地址空间的副本,也继承了所有的互斥量,读写锁和条件变量的状态,如果父进程包含多个线程,子进程在fork返回之后,如果不是紧接着使用exec的话,就要清理锁状态。
2:pthread_atfork最多可以安装三个帮助清理锁的函数。prepare函数将在fork创建子进程之前被调用,通常可以用来获取进程中的所有锁;parent在fork创建子进程后返回前在父进程中被调用,可以用来释放父进程中的锁;child在fork创建子进程后fork返回前在子进程中被调用,可以用来释放子进程中的锁。给这三个参数传递NULL,表示不调用该函数。
发表评论
-
c语言链表实现学生管理
2013-10-28 14:13 867#include<stdio.h> #includ ... -
简单的linux -c http-client
2013-10-23 15:35 4669#include<stdio.h> #includ ... -
毗连“"aa"”和“"bb"”不能给出一个有效的预处理标识符,gcc编译错误表
2013-10-01 18:54 2864gcc bug : ##’ cannot appear at ... -
负数转化为整数
2013-10-01 12:02 1293负数转化为整数 int a = -1321313; 12 ... -
STDIN_FILENO的作用及与stdin 的区别
2013-09-08 14:48 863if(NULL == fgets(msg,100,stdi ... -
linux进程cpu资源分配命令nice,renice,taskset
2013-09-04 14:03 1129nice,renice 指定进程运行的优先级 taskset ... -
c++ 动态内存分配
2013-08-28 22:35 783先看一段代码: [cpp] view plaincopy ... -
探索 Pexpect,第 2 部分:Pexpect 的实例分析
2013-08-19 11:08 1671原文: http://www.ibm.com/develope ... -
shell 文件处理
2013-08-16 15:21 645linux文件合并去重 cat loginpc.txt | ... -
文件结束符EOF,system("stty raw")
2013-08-14 10:47 1505>> 关于文件结束符EOF EOF 是 End O ... -
c 专家编程
2013-08-13 17:06 653总结: -2> int * a = NUL ... -
进程监控
2013-08-12 15:40 612*/10 * * * * sh /opt/fetch/mint ... -
Linux中线程与CPU核的绑定
2013-08-09 15:15 2085最近在对项目进行性能 ... -
建议编译的时候加警告 atof
2013-08-07 20:46 669#include <stdlib.h> ... -
监控脚本的配置
2013-08-05 19:51 56810 9,12,18 * * * /usr/local/bin ... -
feodra 17 安装 chrome
2013-08-04 01:35 7241: 下载:http://www.google.cn/chro ... -
Sudo提权出现:xx用户不在 sudoers 文件中
2013-08-03 20:22 872Sudo提权出现:xx用户不在 sudoers 文件中 症状 ... -
c语言api
2013-07-31 21:06 639原型:extern int isalnum(int c); 用 ... -
c 语言无符号类型使用注意,类型升级
2013-07-30 14:37 588#define SS sizeof(int) 5 int ... -
select,epoll,poll比较
2013-07-28 17:13 650select,poll,epoll简介 se ...
评论