生产者与消费者模型、线程与socket编程
生产者与消费者模型
生产者:生产数据的线程
消费者:使用、处理数据的线程
缓冲区:隔离生产者和消费者,这样可以避免互相等待,提高运行效率。
生产者快于消费者:缓冲区爆满 撑死
消费者快于生产者:缓冲区一直空 饿死
线程与socket编程
由于TCP是面向连接的协议,需要一对一通信,需要为每个客户端进行服务,之前是为每客户端创建一个进程来服务,但创建进程耗费的资源比较大,而较于进程,线程而适合为每个客户端服务。
随着客户端的连接和退出,服务端需要频繁的创建、销毁线程,这比较耗费时间,如何解决?
信号量:
信号量是一个计数量,与进程间通信使用的信号量原理一样,用于控制访问有限的共享资源。
sem_t
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:初始化信号量
pshared:
一般取0,表示进程内,多个线程之间共享使用。
非0,该信号量以共享内存方式,让多个进程使用,但Linux系统不支持。
value:信号量的初始化,代表资源个数。
int sem_wait(sem_t *sem);
功能:对信号量减1操作,如果不能减则阻塞
int sem_trywait(sem_t *sem);
功能:对信号量尝试减1操作,如果不能减则返回错误。
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
功能:对信号量减1操作,如果不能减阻塞abs_timeout时间,超时则返回错误。
int sem_post(sem_t *sem);
功能:对信号量进行加1操作
int sem_destroy(sem_t *sem);
功能:销毁信号量