csapp Concurrent

博客介绍了基于进程、IO Multiplexing和线程的相关内容。基于进程共享信息少且浪费资源,IO Multiplexing使用select操作fdset。还阐述了线程API、线程同步,包括共享变量问题、进度图、Semaphore等,分析了线程不安全情况及死锁,指出进度图判断死锁实用性不高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于进程

Fork()
Signal(SIGCHLD, sigchld_handler)

共享信息比thread少,浪费资源

基于IO Multiplexing

就是使用select操作fdset

int select(int n, fd_set *fdset, NULL,NULL,NULL);

fdset就是fd列表的bitmap,n是大小,有这些宏操作指令

FD_ZERO(fd_set *fdset); //统统清空
FD_CLR(int fd,fd_set *fdset); //清掉一个fd
FD_SET(int fd,fd_set *fdset); //开一个fd
FD_ISSET(int fd,fd_set *fdset);//返回某个fd是开着的吗

select.c

基于线程

API

int pthread_create(pthread_t *tid, pthread_addr_t *addr, func *f, void *arg);
pthread_t pthread_self(void);
int pthread_exit(void *thread_return);
int pthread_cancel(pthread_t tid);
int pthread_join(pthread_t tid, void **thread_return);//阻塞,等tid结束,然后release它的资源,成功的话返回0
int pthread_detach(pthread_t tid);//分离tid,我不管tid了,它结束了就自己回收资源吧
int pthread_once(pthread_once_t *once_control, void (*init_routine)(void));

线程同步

共享变量count问题

其他指令H
movl count, %eax
leal l(%eax), %edx //count++
movl %edx, count
其他指令T

进度图

progress-graph

Semaphore

然后就要锁定不安全区
semaphore-op
semaphore
就是看每个点只能往上和往右走,但是P操作可能会被block,V操作是自由的
红线就是被block的P操作。保护出来走不到的点就是禁止区。

线程不安全的情况

  1. 共享变量
  2. 调用线程不安全的函数

死锁

deadlock
书里说的重叠就是死锁,不是说禁止区重叠,而是block的红线相交了,交点左下角那个地方又不能往上,又不能往右,死锁。
感觉这个进度图不太实用,一般判断死锁也不会去画这个。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值