当前位置:网站首页>【线程网络】了解线程属性(fork/interview question)
【线程网络】了解线程属性(fork/interview question)
2022-08-02 14:13:00 【白U】
- fork对于有锁的多线程的影响
未使用 arfork: - atfork
pthread_atfork(prepare,parent,child);
只要在执行fork之前执行。
执行在pid_t pid= fork();的时候
(一行代码实现三个功能),相当于fork设置的方法,参数为三个函数,在for()之前,prepare给所有的互斥锁,加锁,占用锁(在父进程中执行),因此fork后,调用parent和child给父进程和子进程中的锁,释放。(这个锁的目的,是为锁住父进程中锁的状态,fork后能够清楚子进程的锁状态),在fork之后,父进程和子进程就可以分别通过互斥锁来控制访问临界资源。。成功返回0,失败返回退出码。
也可以说是,在系统访问临界资源之前的时候,没有人用锁的时候,进行fork()
第一个方法是在fork之前就会被调用(保证在fork的时候没有人使用临界资源,因为是自己加的锁,就是为了将锁占用,不是为了访问资源)(不会受复制父进程锁的状态,无法对子进程所的状态不确定的影响),后两个在fork以后调用,在子进程中调用。
#include<pthread.h>
#include<sys/wait.h>
pthread_mutex_t mutex;
void prepare(void)
{
pthread_mutex_lock(&mutex);
}
void after(void)
{
pthread_mutex_unlock(&mutex);
}
void *fun(void *arg)
{
pthread_mutex_lock(&mutex);
printf("fun lock\n");
sleep(5);
pthread_mutex_unlock(&mutex);
printf("fun unlock\n");
}
int main()//并法和并行
{
pthread_t id;
pthread_attr_t attr; //初始化线程属性对象
pthread_mutex_init(&mutex,NULL);
pthread_attr_init(&attr);
pthread_atfork(prepare,after,after); // 相当于fork设置的方法,参数为三个函数,在for()之前,prepare给所有的互斥锁,加锁,占用锁(在父进程中执行),因此fork后,调用after给父进程和子进程中的锁,释放。(这个锁的目的,是为锁住父进程中锁的状态,fork后能够清楚子进程的锁状态),在fork之后,父进程和子进程就可以分别通过互斥锁来控制访问临界资源。
pthread_attr_set_setfetachstate(&attr,PTHREAD_CREARE_DETACHED);//设置线程属性
pthread_create(&id,NULL,fun,NULL);
sleep(1);
pid_t pid= fork();
if(pid == -1)
{
exit(1);
}
if(pid == 0)
{
pthread_mutex_lock(&mutex);
printf("child lock start\n");
pthread_mutex_unlock(&mutex);
printf("child lock success\n");
exit(0);
}
wait(NULL);
pthread_join(id,NULL);
pthread_mutex_destroy(&mutex);
exit(0);
}
- 线程属性。 《Linux程序设计-中文第4版》P452
“脱离线程” ,主线程为用户服务,创建第二线程。第二线程只负责备份用户数据,结束后直接终止,无需返回主线程。这种线程就可以通过修改线程属性,或调用pthread_detach的方法创建他们。
第一步:使用pthread_attr_t atrr;
pthread_atrr_init() 初始化线程对象
第二步:设置线程属性,pthread_attr_set_setfetachstate(&attr,detachedstate)
detachedstate
,这个属性(两个状态JOINABLE
和DETACHED
)允许我们无需对线程进行重新合并PTHREAD_CREARE_JOINABLE
允许两个线程重新合并PTHREAD_CREARE_DETACHED
不能调用pthread_join()来获取另外一个线程的退出
线程和进程和概念:
线程的实现:从Linux的角度讲《linux内核设计与实现第三版》3.3
线程的并发运行:5000 4999 主线程运行的太快
线程同步的方法:对临界资源的访问,举个例子,红绿灯控制交通,、
线程安全:用进程同步的方法解决并发,并行带来的问题
多线程的调试《高性能服务器编程》16.3.2gdb调试多线程
(遇到死锁,怎莫解决)?
边栏推荐
- 第二十五章:一文掌握while循环
- 富文本编辑
- 仿真结果的格式&定制
- Qt | 串口通信 QSerialPort
- unity Domain Reload & scene Reload 静态变量重置
- shader入门精要2
- MATLAB drawing command fimplicit detailed introduction to drawing implicit function graphics
- 剑指offer:删除链表中重复的节点
- What are IPV4 and IPV6?
- STM32LL library - USART interrupt to receive variable length information
猜你喜欢
随机推荐
7. Redis
从FAST TCP到POWERTCP
奇技淫巧-位运算
queue的c实现
flex布局
LeetCode 2343. 裁剪数字后查询第 K 小的数字 暴力+语法考察
动态数组-vector
1. Development community homepage, register
Qt | 定时器的使用 QTimer
Detailed explanation of MATLAB drawing function fplot
3. User upload avatar
第三十三章:图的基本概念与性质
Unity中事件的3种实现方法
mysql学习总结 & 索引
学习笔记(01):activiti6.0从入门到精通-工作流的介绍以及插件的安装
光栅区域衍射级数和效率的规范
分布式一致性协议-Raft
剑指offer:在O(1)时间删除链表结点
关于分布式的一些知识点
Happy, 9/28 scene collection