6.3 互斥量加锁和释放

方法

pthread_mutex_lock(mutex)

pthread_mutex_trylock(mutex)

pthread_mutex_unlock(mutex)

用法

        线程可调用pthread_mutex_lock()来获取某个互斥量,如果该互斥量已经被其他线程加锁,则该线程将会被阻塞,直到互斥量被其他线程释放。

        线程可调用pthread_mutex_trylock()来尝试获取某个互斥量,如果该互斥量已经被其他线程加锁,方法会直接返回一个表示互斥量“正忙”的错误码。在一些情况下调用这个方法可避免死锁的发生,譬如优先级翻转的情况。

        线程可以调用pthread_mutex_unlock()来释放某个互斥量。当多个线程同时访问共享数据时,获得互斥量的线程在完成相关操作后才能够调用该方法释放互斥量。当情况如下时该方法会返回一个错误码:

  • 互斥量已经被释放
  • 互斥量被其他线程加锁

        互斥量并没有那么复杂,它就像是线程竞争时的“君子协议”。由编程人员来确保线程正确地对互斥量进行加锁和释放 ,下面是一个错误的使用示例。

Thread 1
Lock
A = 2
Unlock

Thread 2
Lock
A = A+1
Unlock

 

Thread 3

A = A*B

 

        问题:当多个线程同时等待一个被加锁的互斥量时,哪个线程会在互斥量被释放时首先获得它

        回答:除非使用了线程优先级调度策略,否则将由系统来决定哪个线程先获取互斥量,而结果一般是随机的。

你可能感兴趣的:(c语言,Pthreads)