cs241 critical_concurrency
函数原型 int sem_init(sem_t *sem, int pshared, unsigned int value);
说明:
C语言中,信号量的数据类型为结构sem_t,它本质上是一个长整型的数
sem_init()初始化一个定位在sem的匿名信号量。value参数指定信号量的初始值。pshared参数指明信号量是由进程内线程共享还是由进程间共享。若pshared的为0,那么信号量将被进程内的线程共享,若pshared是非0值,那么信号量将在进程间共享
usleep()函数是把调用该函数的线程挂起一段时间单位是微秒
函数sem_post( sem_t *sem )用来增加信号量的值。当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不在阻塞,选择机制同样是由线程的调度策略决定的。
函数sem_wait( sem_t *sem )被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。函数sem_trywait ( sem_t *sem )是函数sem_wait()的非阻塞版本,它直接将信号量sem的值减一。
函数sem_destroy(sem_t *sem)用来释放信号量sem。
使用信号量的时候要在编译的时候加-pthread
pthread_mutex_t:互斥锁,多线程中对共享变量的包保护
初始化:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
//or
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t: 条件变量,线程间同步一般和pthread_mutex_t一起使用,以防止出现逻辑错误,即如果单独使用条件变量,某些情况下(条件变量前后出现对共享变量的读写)会出现问题
初始化:
#include <pthread.h>
int pthread_cond_init(pthread_cond_t *cv, const pthread_condattr_t *cattr);
//or
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
阻塞在条件变量上pthread_cond_wait,用于阻塞当前线程,等待别的线程使用pthread_cond_signal()
或pthread_cond_broadcast
来唤醒它 pthread_cond_wait()
必须与pthread_mutex
配套使用。pthread_cond_wait()函数一进入
wait状态就会自动
release mutex。当其他线程通过
pthread_cond_signal()或
pthread_cond_broadcast,把该线程唤醒,使
pthread_cond_wait()通过(返回)时,该线程又自动获得该
mutex`。
解除在条件变量上的阻塞pthread_cond_signal,该函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal
也会成功返回。
阻塞直到指定时间pthread_cond_timedwait
释放阻塞的所有线程pthread_cond_broadcast
释放条件变量pthread_cond_destroy