一、线/进程间同步互斥
(1)互斥:一个进程或者线程是否可以获得资源的使用权 (2)同步:对资源是否能够有序访问
1.互斥机制
(1)互斥锁
- pthread_mutex_init();//初始化锁(因为线程共享进程的资源,所以可以在进程中将锁声明为全局或静态变量)
- pthread_mutex_destroy(); //释放锁
- pthread_mutex_lock(); //获得锁,此时只有本线程能访问资源。如果锁被其他线程占用,这里无法获得锁,则本线程睡眠
- pthread_mutex_trylock(); //获得锁。 如果锁被其他线程占用,这里会执行失败,返回EBUSY
- pthread_mutex_unlock(); //资源调用完成后,释放锁
(2)自旋锁
- DEFINE_SPINLOCK(lock);
- spin_lock(&lock);
- spin_unlock(&lock);
跟互斥锁的区别: 互斥锁如果获取不到锁会睡眠,自旋锁如果获取不到锁,会一直循环检测这把锁什么时候被别的线程释放,然后再上锁。 缺点: 一直占用CPU资源,如果线程等待时间比较长,CPU的效率就会下降
2.同步机制
(1)信号量
- sem_t sem ; //声明一个信号量
- sem_init(); //初始化信号量,这里信号量的值可以是多个
- sem_wait(); //获得信号量,信号量的值减1 P操作
- sem_post(); //释放信号量,信号量的值减1 V操作
可以定义多个信号量,初始化时给信号量赋值一个数就行,但一般只初始化一个信号量,用于2个线程
(2)条件变量
-
pthread_cond_t cond; //创建条件变量 -
pthread_cond_init(); //初始化条件变量 -
pthread_cond_destroy(); // -
pthread_cond_wait(); //等待唤醒 -
pthread_cond_broadcast(); //唤醒所有等待这个条件变量的线程 -
pthread_cond_signal(); //唤醒某一个等待这个条件变量的线程 条件变量和互斥锁一般搭配使用,用条件变量唤醒这个线程后,用互斥锁把资源锁死,只能本线程调用,工作都做完以后,再释放互斥锁,需要的话再唤醒另一个线程继续执行
二、进程间通信机制
1.无名管道(pipe)
2.有名管道(fifo)
3.消息队列(本质:一个消息的链表)
-
ftop(); //创建KEY,通过KEY来判断自己操作哪一个消息队列 -
msgget(key,属性); //创建或打开消息队列。属性:IPC_CREAT - 消息队列不存在则创建,存在则打开 -
msgsnd(); //发送消息;其中有一个指针用来表示要发送的消息,一般是一个消息结构体 -
msgrcv(); //接收消息 -
msgctl(); //操作消息队列,比如删除 比如:用BOA服务器搭了一个网页,网页端跟嵌入式主控程序之间就可以通过消息队列传输数据
4.共享内存(最快的,效率最高的通信方式,因为操作的是同一个内存空间)
- shmget(); //创建共享内存
- shmat(); //映射共享内存
- shmdt(); //接触映射
- mmap(); /
5.信号量
6.socket套接字(TCP、UDP通信)
- socket();创建socket套接字
- 注册网络协议族
- bind()绑定
- listen()监听
- connect()连接
- accept()接受连接
|