linux进程通信线程同步,linux进程间通信_线程间同步总结

linux进程间通信_线程同步总结

linux 进程间通信机制:

1. socket:

同一主机之间的进程间通信用unix 域套节字, 不同主机间用网络套节字。

2. 共享内存

不需要在应用层与内核之间拷贝数据,是最快的进程间通信方式,但需要解决同步问题,通常用信号量来实现

同步。

通常通过已存在的文件名,由ftok函数获取一个key_t参数。

shmget 创建或获取共享内存标识符

shmat 共存内存地址映射到进程地址空间

shmdt 进程脱离与共享内存地址的联系

shmctl 管理共享内存, 删除等

3. 管道,即无名管道,通过pipe(fd[2]) 来创建, 用于父子或兄弟进程之间进行通信。 进程退出后管道被回收。

4. FIFO,即命名管道,有名管道, 通过mkfifo 来创建, 可用于没有血缘关系的进程之间通信, 生成一个管道文件, 所有进程

退出后,内核回收资源, 但需要调用unlink来显式删除管道文件。

5. 消息队列, 通过msgget 来创建和获取, 也通过ftok先获取key_t参数。 函数有

msgsnd

msgrcv

msgctl

进程退出后,消息队列还在,需显式调用msgctl 来删除该消息队列。

6. 信号量(信号灯), 一般用于进程间同步,通过semget 来创建和获取,

semop 获取信号量时调用这个函数,使信号量(为一个整数变量)的值减1,

获取信号量时,调用这个函数,使信号量的值加1.

semctl ,需显式删除。

线程同步机制:

1. 信号量

2. 互斥锁(mutex) pthread_mutex_t 为数据结构, 互斥锁在没有获得锁的时候,线程进入睡眠状态,不执行cpu操作, 区别于自旋锁(spinlock),会一直执行cpu空操,在原地旋转。因此spinlock比较适合于“快拿快放”的使用场景。

pthread_mutex_lock

pthread_mutex_trylock

pthread_mutex_unlock

pthread_mutex_destroy

3. 条件变量 pthread_con_t

int pthread_cond_signal(pthread_cond_t *cond); //唤醒等待条件某个线程

int pthread_cond_broadcast(pthread_cond_t *cond); //唤醒等待条件所有线程

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); //等待条件发生。

条件变量通常与互斥锁一起使用, 条件变量用于一个线程或进程等待某个事件成立之后再执行。即一个进程等待另一个进程完成某个事件。

互斥锁 与条件变量可以用于不同进程间,但其数据结构需要放在共享内存中。

4. 自旋锁(spinlock),

a) 作用范围,mutex是内核对象,可以在多线程,多进程同步中使用;spinl

ock作用范围仅限于本进程(锁变量是进程内的),仅适用于多线程同步。

b) spinlock依赖于硬件的原子操作指令

c) 线程获取spinlock失败时,会采取循环等待的方式,此时线程处于运行状态,CPU空转;而获取mutex失败时,线程会挂起,线程处于wait状态,不会被内核

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值