当前位置:网站首页>【线程网络】了解线程属性(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调试多线程
(遇到死锁,怎莫解决)?
边栏推荐
猜你喜欢
随机推荐
Open the door of electricity "Circuit" (1): voltage, current, reference direction
Unity-编辑器扩展(Editor)
LeetCode 2343. 裁剪数字后查询第 K 小的数字 暴力+语法考察
Unity插件-NGUI
unity-shader(中级)
二叉排序树与 set、map
线性结构,顺序结构
求解斐波那契数列的若干方法
How does ns3 solve cross reference issue
Server-Sent Events 一种轻量级的Push方式
图解MESI(缓存一致性协议)
Introduction to C language function parameter passing mode
饥荒联机版Mod开发——配置代码环境(二)
深入理解负载均衡
unity 和C# 一些官方优化资料
光波导k域布局可视化(“神奇的圆环”)
7.Redis
面试汇总
Project: combing the database table
6.统一记录日志