线程同步概念:线程按照先后次序运行;
线程同步指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其他线程为保证数据的一致性,不能调用该功能;
需要线程同步的原因:1.数据共享;2.线程之间竞争;3.多个对象没有合理的同步机制;(前2点不能改变,因此只能修改第三点)
互斥量(互斥锁):锁不具有强制性(建议锁)
读写锁:
条件变量:
信号量:
进程间同步:1.信号量;2.文件锁,
restrict关键字:只用于限制指针,告诉编译器,所有修改该指针指向内存中内容的操作,只能通过本指针完成,不能通过本指针以外的其他变量或者指针修改,意思就是不能定义一个相同类型的指针接收这个指针的值,然后修改内存中的内容;
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <pthread.h>
5 #include <unistd.h>
6 pthread_mutex_t mutex;//定义锁
7 void* tfn(void* arg)
8 {
9 srand(time(NULL));
10 while(1)
11 {
12 pthread_mutex_lock(&mutex);
13 printf("hello ");
14 sleep(rand()%3);
15 printf("world\n");
16 pthread_mutex_unlock(&mutex);
17 sleep(rand()%3);
18 }
19 return NULL;
20 }
21
22 int main()
23 {
24 int flag = 5;
25
26 pthread_t tid;
27 srand(time(NULL));
28 pthread_mutex_init(&mutex,NULL);//mutex == 1
29 pthread_create(&tid,NULL,tfn,NULL);
30 while(flag--)
31 {
32 pthread_mutex_lock(&mutex);
33 printf("HELLO ");
34 sleep(rand()%3);
35 printf("WORLD\n");
36 pthread_mutex_unlock(&mutex);
37 sleep(rand()%3);
38
39 }
40 pthread_cancel(tid);
41 pthread_join(tid,NULL);
42 pthread_mutex_destroy(&mutex);//mutex == 0
43
44 return 0;
45 }`
结论:在访问共享资源前枷锁,访问结束后**立即解锁**;锁的粒度越小越好;