全球旧事资料 分类
oidqpthread_createcid2NULLco
sumer2voidqpthread_joi
pid1NULLpthread_joi
cid1NULLpthread_joi
pid2NULLpthread_joi
cid2NULLsem_destroybla
k_
umbersem_destroyproduct_
umber程序运行结果如下:
f5.实验总结
1写出Li
ux系统中线程同步实现机制有哪些?怎样使用?Li
ux系统中线程同步实现机制通过对互斥变量Mutex、信号灯Semophore、条件变量Co
ditio
s的设置实现线程的同步。1互斥变量(Mutex)互斥变量的类型为pthread_mutex_t。可以声明多个互斥量。在声明该变量后,你需要调用pthread_mutex_i
it来创建该变量。pthread_mutex_i
it的格式如下:i
tpthread_mutex_i
itpthread_mutex_tmutexco
stpthread_mutexattr_tmutexattr第一个参数mutext,也就是你之前声明的那个互斥量,第二个参数为该互斥量的属性。在创建该互斥量之后,你便可以使用它了。要得到互斥量,你需要调用下面的函数:i
tpthread_mutex_lockpthread_mutex_tmutex该函数用来给互斥量上锁,也就是等待操作。互斥量一旦被上锁后,其他线程如果想给该互斥量上锁,那么就会阻塞在这个操作上。如果在此之前该互斥量已经被其他线程上锁,那么该操作将会一直阻塞在这个地方,直到获得该锁为止。在得到互斥量后,就可以进入关键代码区了。同样,在操作完成后,你必须调用i
tpthread_mutex_u
lockpthread_mutex_tmutex函数来给互斥量解锁,也就是释放。这样其他等待该锁的线程才有机会获得该锁,否则其他线程将会永远阻塞。(2)信号灯机制(Semaphore)信号灯其实就是一个计数器,也是一个整数。每一次调用wait操作将会使semaphore值减一,而如果semaphore值已经为0,则wait操作将会阻塞。每一次调用post操作将会使semaphore值加一。生产者线程在每次往缓冲池中添加产品后调用post操作,信号灯值会加一。这样阻塞的工作线程就会停止阻塞,继续往下执行。信号灯的类型为sem_t。在声明后必须调用sem_i
it。需要传递两个参数,第一个参数就是你之前声明的sem_t变量,第二个必须为0。当你不再需要信号灯时,你必须调用
fsem_destroy来释放资源。等待信号灯的操作为sem_wait。和互斥量一样,等待信号灯也有一个非阻塞的操作,sem_trywait。该操作在没有信号灯的时候返回EAGAIN。(3)条件变量(Co
ditio
s)如果现在在等待一个信号。如果该信号被设置,则继续运行。如果没有条件变量,它将会不停的去查询该信号是否被设置,这样就会浪费大量的处理机。而通过使用条件变量,我们就可以将等待信号的线程阻塞,直到有信号的时候再去唤醒它。条件变量的类型是pthread_co
d_tr
好听全球资料 返回顶部