线程间同步机制与进程间通信
线程间同步机制用于协调多个线程的执行顺序,确保任务按预期顺序执行。异步执行是多线程和多进程的本质,CPU调度具有随机性。信号量是实现线程间同步的一种机制。
信号量操作步骤
定义信号量对象:
sem_t sem;
初始化信号量:
sem_init(&sem, 0, 1); // 初始值为1,线程间共享
PV操作:
P操作(申请信号量):
sem_wait(&sem); // 申请信号量
V操作(释放信号量):
sem_post(&sem); // 释放信号量
销毁信号量:
sem_destroy(&sem);
函数接口说明
初始化信号量:
int sem_init(sem_t *sem, int pshared, unsigned int value);
sem
:信号量对象地址
pshared
:0表示线程间共享,非0表示进程间共享
value
:信号量初始值
申请信号量:
int sem_wait(sem_t *sem);
释放信号量:
int sem_post(sem_t *sem);
销毁信号量:
int sem_destroy(sem_t *sem);
死锁与解决方法
死锁是多线程环境中因资源竞争导致的永久等待状态。产生死锁的四个必要条件:
- 互斥条件:资源每次只能被一个线程使用
- 请求与保持条件:线程持有资源并请求其他资源
- 不剥夺条件:线程持有的资源不能被强制释放
- 循环等待条件:多个线程形成循环等待资源链
解决方法
锁成对出现
统一加锁顺序
破坏循环等待条件
使用非阻塞锁
进程间通信(IPC)
进程间通信因空间独立而需要特殊机制。通信方式分为同一主机和不同主机两类。
同一主机通信方式
- 古老通信方式
- 无名管道
- 有名管道
- 信号
- IPC对象通信
- 共享内存
- 消息队列
- 信号量集
不同主机通信方式
Socket通信
无名管道操作 创建管道:
int pipe(int pipefd[2]);
pipefd[0]
为读端,pipefd[1]
为写端
读写操作:
write(pipefd[1], buf, len); // 写管道
read(pipefd[0], buf, len); // 读管道
关闭管道:
close(pipefd[0]); // 关闭读端
close(pipefd[1]); // 关闭写端
有名管道操作 创建管道文件:
int mkfifo(const char *pathname, mode_t mode);
pathname
:管道文件名称
mode
:文件权限
打开和读写:
int fd = open(pathname, O_RDWR); // 打开管道
write(fd, buf, len); // 写管道
read(fd, buf, len); // 读管道
close(fd); // 关闭管道
删除管道文件:
remove(pathname);
ips:1.代码编写时,注意的事项。
高内聚:增强代码的复用性。
低耦合:设计程序时,模块与模块之间(函数与函数之间)的关联度要低。
2.代码设计时,注意的事项。
开闭原则:对增加开放,对修改关闭。
3.互斥锁在全局变量初始化时,可以使用系统中的一个宏
4.void *memset(void *s, int c, size_t n);
功能:将内存区域填充成指定的数据
参数:
s:要填充的空间首地址
c:要填充的地址
n:要填充的字节数
返回值
成功:返回s的首地址
失败:NULL
5.单工:广播(管道)
半双工:对讲机
全双工:打电话
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_72612809/article/details/150484626