- 浏览: 153426 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
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 901#include<stdio.h> #includ ... -
简单的linux -c http-client
2013-10-23 15:35 4726#include<stdio.h> #includ ... -
毗连“"aa"”和“"bb"”不能给出一个有效的预处理标识符,gcc编译错误表
2013-10-01 18:54 2995gcc bug : ##’ cannot appear at ... -
负数转化为整数
2013-10-01 12:02 1354负数转化为整数 int a = -1321313; 12 ... -
STDIN_FILENO的作用及与stdin 的区别
2013-09-08 14:48 906if(NULL == fgets(msg,100,stdi ... -
linux进程cpu资源分配命令nice,renice,taskset
2013-09-04 14:03 1163nice,renice 指定进程运行的优先级 taskset ... -
c++ 动态内存分配
2013-08-28 22:35 844先看一段代码: [cpp] view plaincopy ... -
探索 Pexpect,第 2 部分:Pexpect 的实例分析
2013-08-19 11:08 1718原文: http://www.ibm.com/develope ... -
shell 文件处理
2013-08-16 15:21 725linux文件合并去重 cat loginpc.txt | ... -
文件结束符EOF,system("stty raw")
2013-08-14 10:47 1555>> 关于文件结束符EOF EOF 是 End O ... -
c 专家编程
2013-08-13 17:06 688总结: -2> int * a = NUL ... -
进程监控
2013-08-12 15:40 674*/10 * * * * sh /opt/fetch/mint ... -
Linux中线程与CPU核的绑定
2013-08-09 15:15 2128最近在对项目进行性能 ... -
建议编译的时候加警告 atof
2013-08-07 20:46 708#include <stdlib.h> ... -
监控脚本的配置
2013-08-05 19:51 62310 9,12,18 * * * /usr/local/bin ... -
feodra 17 安装 chrome
2013-08-04 01:35 7671: 下载:http://www.google.cn/chro ... -
Sudo提权出现:xx用户不在 sudoers 文件中
2013-08-03 20:22 911Sudo提权出现:xx用户不在 sudoers 文件中 症状 ... -
c语言api
2013-07-31 21:06 676原型:extern int isalnum(int c); 用 ... -
c 语言无符号类型使用注意,类型升级
2013-07-30 14:37 624#define SS sizeof(int) 5 int ... -
select,epoll,poll比较
2013-07-28 17:13 683select,poll,epoll简介 se ...
相关推荐
APUE详细讲解了线程的创建、同步与调度,包括线程函数的定义、线程属性的设置、线程同步机制如互斥锁(mutexes)、条件变量(condition variables)和读写锁(read-write locks)。这些概念对于编写高效、无冲突的多...
2. **进程管理**:包括进程创建(fork())、进程执行(exec()系列函数)、进程间通信(管道、套接字、信号量、消息队列等)、进程同步和互斥(如mutexes、semaphores)。 3. **线程编程**:在Unix环境中,线程是轻...
7. **多线程编程**:使用`pthread.h`头文件中的函数进行线程创建、同步和互斥锁等操作。 8. **网络编程**:包括套接字API,如`bind()`, `listen()`, `connect()`, `send()`, `recv()`等,以及TCP/IP和UDP协议的使用...
1. **进程管理**:这部分代码展示了如何创建、终止进程,以及如何利用fork、exec系列函数实现进程间的通信和协作。例如,`waitpid.c`解释了如何等待子进程结束并获取其状态信息。 2. **文件I/O**:`stdio_ex.c`和`...
APUE涵盖了许多关键的Unix编程主题,包括进程管理、文件I/O、信号处理、系统调用接口、标准库函数、多线程编程、网络编程、内存管理和错误处理等。以下是对这些知识点的详细阐述: 1. **进程管理**:Unix系统中的...
守护进程和高级I / O 进展间通信 全书脉络清晰,提纲挈领,又有很多不错的实例,我相信每一个看完这本书的人都会受益匪浅。不过在一些内容上我觉得作为后起之秀的《 Linux / UNIX系统编程手册》有很多不错的地方或者...
UNIX 是多进程操作系统,在两次运行 ./a.out 的时间间隔内,有两个程序被操作系统调起成为执行实例,成为占用 CPU 和内存资源的进程,并被内核分配了唯一标识符进程ID,分别为 852 和 853。 1.3 下面函数声明中,...
1. **进程管理**:包括进程创建(fork)、进程终止(exit)、进程间通信(pipe、socket、message queue、semaphore、shared memory)等。`apue.2e`中的代码可能会展示如何使用这些机制实现进程间的协同工作。 2. **...
6. **多线程编程**:介绍线程的概念、线程创建、线程同步(互斥锁、条件变量、读写锁)和线程通信(信号量、线程取消)。 7. **错误处理**:如何正确处理和报告系统调用和库函数的错误,以及使用`errno`和`perror()...
2. **线程编程**:讲解线程创建、同步(互斥锁、条件变量、读写锁)、调度和取消等,帮助理解多线程环境下的程序设计。 3. **文件系统与I/O**:介绍文件系统的基本操作,如打开、关闭、读写、定位,以及低级I/O...
APUE这本书涵盖了广泛的主题,包括进程管理、文件I/O、网络编程、多线程、信号处理、内存管理等。每个章节都配有相应的示例代码,帮助读者理解和实践这些概念。在压缩包中的“www.pudn.com.txt”可能是一个链接到更...
了解如何通过fork、exec、wait等系统调用来控制进程的生命周期,以及如何处理进程间的交互和协作。 2. **文件系统**:深入理解UNIX文件系统模型,包括文件操作、目录结构、权限管理、硬链接与软链接。学习open、...
3. **进程管理**:包括进程创建、进程控制、进程间通信(IPC)等主题,如fork、exec、wait、pipe、socket、信号量、消息队列和共享内存等。 4. **文件和I/O系统**:讲解了文件系统的基本操作,如打开、关闭、读写...
APUE手册中的程序(UNIX:registered:环境中的高级编程)。 进步 第1章:简介 第2章:无文件:() 第3章:fileio 第4章:filedir 去做 列表 TODO: ... 如何建造 export DYLD_LIBRARY_PATH=/Applications/Xcode...
而《UNIX环境高级编程》(APUE, Advanced Programming in UNIX Environment)无疑是这个领域的圣经,是每位开发者必读的神作。精准的用语、精良的语言组织,经历了漫长岁月的千锤百炼,可谓无出其右。数年来,这本书曾...
8. **多线程编程**:介绍线程的创建、同步、互斥锁、条件变量、线程局部存储等概念,以及在多线程环境下解决问题的方法。 9. **错误处理**:如何正确地处理和报告程序运行时的错误,编写健壮的UNIX程序。 10. **...
为什么创造这个项目 此项目为《 UNIX环境高级编程》的课后习题个人答案,这种偏实际应用的书,需要配合每一章后面的习题使用效果更佳。 每一章的习题答案放在独立的目录中,代码以习题号命名,例如第一章第一题的...
2. **进程管理**:掌握创建子进程(fork)、进程间通信(管道、套接字、共享内存、消息队列等)和进程调度的概念。 3. **信号处理**:学习如何捕获、发送和处理信号,用于程序的异常处理和同步。 4. **网络编程**...
11. **线程编程**:虽然UNIX早期不支持线程,但现代UNIX如Linux已支持POSIX线程(pthread),APUE2也对此进行了详细介绍,包括线程创建、同步、互斥锁等。 通过学习APUE2,开发者不仅可以掌握UNIX系统编程的基本...