当前位置:网站首页>【线程网络】了解线程属性(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调试多线程
(遇到死锁,怎莫解决)?
边栏推荐
猜你喜欢
Detailed explanation of MATLAB drawing function plot
分布式一致性协议-Paxos
队列与栈
Litestar 4D – WebCatalog 7:全自动数据管理
Based on the least squares linear regression equation coefficient estimation
剑指offer:在O(1)时间删除链表结点
change the available bandwidth of tcp flow dynamically in mininet
implement tcp copa on ns3
C语言函数调用过程-汇编分析
锥形相位掩模的Talbot图像
随机推荐
Unity中事件的3种实现方法
LeetCode 2343. 裁剪数字后查询第 K 小的数字 暴力+语法考察
光波导的入射耦合和出射耦合区域
Run ns3 with multiple processes
LITESTAR 4D应用:室内植物照明模拟
光波导应用中的真实光栅效应
3.用户上传头像
动态数组-vector
Detailed explanation of MATLAB drawing function plot
7.Redis
光波导k域布局可视化(“神奇的圆环”)
Qt | 定时器的使用 QTimer
LeetCode 2353. 设计食物评分系统 维护哈希表+set
px和em和rem的区别
implement tcp bbr on ns3 (在ns3上实现TCP BBR)
关于推荐系统的随想
Evaluation multipath weswood congestion control on ns3
剑指offer:删除链表中重复的节点
【离散化+前缀和】Acwing802. 区间和
Redis 学习part one