PS:互斥锁的生存周期必须大于用到互斥锁的线程的生存周期!
mutex————互斥锁。
线程挂起直到共享数据的某些条件得到满足。
当线程运行到等待函数时,解开第二个参数的互斥锁,并等待信号;当接收到第一个参数的信号后,开始抢锁,抢到锁后继续向下执行。
当线程运行到激活函数时,发出一个信号,并继续执行下面的函数。
等待函数和激活函数必须同时运行才可以接收到信号。
cond——条件变量。
mutex——互斥锁。
abstime——等待时间。
返回值——ETIMEDOUT(超时结束等待)。
返回值——0成功;正数为错误码。
返回值——0为成功;正数为错误码。
#include <stdio.h> #include <pthread.h> #include <sched.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond1 = PTHREAD_COND_INITIALIZER; int currency; void* checkout(void* arg){ sleep(1); for(;;){ pthread_mutex_lock(&mutex); printf("checkout enter\n"); currency = rand() 00; printf("spend %d\n",currency); if(currency >= 1000){ printf("signal boss\n"); pthread_cond_signal(&cond1); printf("wait answer\n"); } printf("checkout leave\n"); pthread_mutex_unlock(&mutex); sleep(1); } } void* boss(void* arg){ for(;;){ pthread_mutex_lock(&mutex); printf("boss enter\n"); printf("boss wait\n"); pthread_cond_wait(&cond1,&mutex); printf("boss agress\n"); printf("boss leave\n"); pthread_mutex_unlock(&mutex); sleep(1); } } int main(){ typedef void*(*func_t)(void*); func_t funcs[2] = {boss,checkout}; pthread_t tids[2]; int i; pthread_setconcurrency(2); for(i=0;i<2;i++){ pthread_create(&tids[i],NULL,funcs[i],NULL); } for(i=0;i<2;i++){ pthread_join(tids[i],NULL); } }
