-
Notifications
You must be signed in to change notification settings - Fork 0
/
pthread加锁,死锁
76 lines (58 loc) · 1.45 KB
/
pthread加锁,死锁
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
两个线程如何避免被死锁
1:不要加同一把锁,
2:有顺序的抢锁
产生死锁的原因
1:对同一个互斥量lock多次
2:不同线程要lock多次
如何避免程序中出现死锁
1:不要多次lock同一个互斥量
2:有多个互斥量约定lock次序
3:用pthread_mutex_trylock()尝试lock
线程的创建
1:线程标识
pthread_t
pthread_self()
pthread_equal()比较线程的函数
2:线程的结束:
1:pthread_exit()
2:线程函数返回
3:被取消
4:调用exit()进程终止
3:线程的收尸
pthread_join()
ps axm -l 线程标识
pthread_join(tid[i],NULL)
pthread_mutex_destroy(&mut)
4:线程的同步
互斥量
pthread_mutex_t初始化同一把锁
抢锁
pthread_mutex_lock(地址)lock加锁加不上的话阻塞
pthread_mutex_trylock()
pthread_mutex_unlock()
pthread_mutex_destroy()
sched_yield()//出让调度器
线程的同步
pthread_cond_wait(&cond, &mut)
1:解锁 2:等条件改变 3:抢锁
signal/broadcast通知法
static pthread_cond_t
pthread_cond_broadcast(&cond);
pthread_cond_destroy(&cond);
pthread_cond_broadcast(&cond);
5:线程的取消
pthread_cancel(线程标识)
异步:立即取消
pthread_test.cancel
6:线程栈清理
pthread_cleanup_push()
pthread_cleanup_pop()
7:线程与信号
尽量避免线程与信号的混用
创建一个线程专门处理信号
其他线程屏蔽信号
pthread_sigmask()
sigwait()
8:线程属性
让线程处于分离状态
pthread_detach()