Linux线程同步

来源:互联网 发布:西方音乐史知乎 编辑:程序博客网 时间:2024/05/16 02:41

线程同步-互斥锁  

1.初始化互斥锁pthread_mutex_init() 

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); 

 

例: 

pthread_mutex_t mutex; 

pthread_mutex_init(&mutex, NULL); 

 

2.锁住互斥锁pthread_mutex_lock() 

int pthread_mutex_lock(pthread_mutex_t *mutex); 

当一个线程执行到此函数时,如果此锁此时被另一个线程使用,那么此线程被阻塞,知道另一个线程释放此互斥锁(第一次执行的线程可以运行,不会阻塞,后来的执行到此函数阻塞) 

成功返回0,否则返回错误号 

 

例:pthread_mutex_lock(&mutex); 

 

3.测试互斥锁pthread_mutex_trylock() 

int pthread_mutex_trylock(pthread_mutex_t *mutex); 

测试完后加锁,trylock后会锁住 

错误返回-1 

 

4.解锁 

pthread_mutex_unlock(&mutex); 

成功返回0,否则返回错误号 

 

5.销毁互斥锁 

pthread_mutex_destroy(&mutex); 

 

线程同步-条件变量  

自定义条件来阻塞进程 

1.初始化条件变量pthread_cond_init() 

int pthread_cond_int(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr); 

第一个参数是指向结构pthread_cond_t的指针,第二个参数cond_attr是一个指向结构pthread_condattr_t的指针。结构pthread_condattr_t是条件变量的属性结构,和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用,默认值是PTHREAD_PROCESS_PRIVATE,即此条件变量被同一进程内的各个线程使用 

例: 

pthread_cond_t cond; 

pthread_cond_init(&cond, NULL); 

 

2.阻塞线程pthread_cond_wait() 

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);(相当于在wait函数此处加一把锁阻塞本线程,并释放另一线程的互斥锁,直到另一线程signal唤醒并unlock解锁后才继续运行,自动解锁,等待完加锁,执行到函数时只起阻塞作用,并解除锁定) 

第一个参数是条件变量,第二个参数是线程阻塞的时候要解开的互斥锁 

例:pthread_cond_wait(&cond, &mutex); 

 

3.唤醒线程pthread_cond_signal() 

int pthread_cond_signal(pthread_cond_t *cond); //唤醒处于wait状态的线程,被唤醒的线程此时处于阻塞状态,直到signal函数所在线程解除互斥锁,wait函数所在线程才会继续运行

int pthread_cond_broadcast(pthread_cond_t *cond); 

用来释放被阻塞在条件变量cond上的线程,这两个函数的区别在于当有多个线程都被同一个条件变量所阻塞时: 

用pthread_cond_broadcast()函数可以使所有线程都被唤醒 

用pthread_cond_signal()时哪一个线程被唤醒是由线程的调度策略所决定的 

例:pthread_cond_singal(&cond); 

 

4.销毁条件变量 

例:pthread_cond_destroy(&cond); 

 

线程同步-信号量  

1.初始化信号量sem_init() 

int sem_init(sem_t *sem, int pshared, unsigned value); 

第一个参数为指向信号量结构的指针 

第二个参数不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享 

第三个参数给出信号量的初值 

 

例: 

sem_t sem; 

sem_init(&sem, 0, 1); 

 

2.PV操作 

V操作 

int sem_post(sem_t *sem);  

参数是要增加的信号量结构体的指针,当有线程阻塞在这个信号量上时,调用sem_post()函数会使其中的一个线程解除阻塞,被解除阻塞的线程随机选择机制同样是由线程的调度策略决定的。当另外一个线程被解除后,信号量又会被马上减少到0 

 

P操作 

int sem_wait(sem_t *sem);  

int sem_trywait(sem_t *sem); 

函数sem_wait()被用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减1,表明公共资源经使用后减少 

函数sem_trywait()的区别是当信号量等于0时,不会阻塞当前线程 

 

3.销毁 

int sem_destroy(sem_t *sem); 

0 0
原创粉丝点击