嵌入式第三十一天(线程间的机制,IPC机制)
一.线程间的机制:
二.死锁
死锁是指在多进程或多线程环境中,两个或多个进程(线程)相互等待对方释放资源,而陷入无限期阻塞的状态。
死锁产生的四个必要条件:
- 互斥条件:资源只能被一个进程(线程)占用,无法同时被多个使用。
- 持有并等待条件:进程(线程)已经持有至少一个资源,同时又在等待其他资源。
- 不可剥夺条件:已分配的资源不能被强制剥夺,只能由持有资源的进程(线程)主动释放。
- 循环等待条件:多个进程(线程)之间形成一种头尾相接的循环等待资源关系。
死锁的处理方式:
示例:
#include<stdio.h>
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include<unistd.h>char buff[1024] = {"ABC"};sem_t sem_A;
sem_t sem_B;
sem_t sem_C;void *task1(void *arg)
{while (1){sem_wait(&sem_A);printf("buff = %c\n",buff[0]);sem_post(&sem_B);}
}void *task2(void *arg)
{while (1){sem_wait(&sem_B);printf("buff = %c\n", buff[1]);sem_post(&sem_C);}
}void *task3(void *arg)
{while (1){sem_wait(&sem_C);printf("buff = %c\n", buff[2]);sem_post(&sem_A);sleep(1);}
}int main(int argc, const char *argv[])
{pthread_t tid[3];sem_init(&sem_A,0,1);sem_init(&sem_B,0,0);sem_init(&sem_C,0,0);pthread_create(&tid[0], NULL, task1, NULL);pthread_create(&tid[1], NULL, task2, NULL);pthread_create(&tid[2], NULL, task3, NULL);pthread_join(tid[0], NULL);pthread_join(tid[1], NULL);pthread_join(tid[2], NULL);sem_destroy(&sem_A);sem_destroy(&sem_B);sem_destroy(&sem_C);return 0;
}
三.IPC机制
1.进程间通信:IPC机制
进程间空间独立,无法直接通信,需要IPC机制实现通信。
2.同一主机进程间通信
1)古老的通信方式
无名管道,有名管道
信号:进程间通知机制
2)IPC对象通信system V
共享内存*:效率最高
消息队列
信号量集(信号灯)
主要用在不同主机进程间通信
3)socket通信:
网络通信
3.无名管道:
示例:
4.有名管道:
示例:
补充: