一、有关互斥锁的函数
1、 int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);//初始化一个互斥锁
2、int pthread_mutex_lock(pthread_mutex_t *mutex);//用于锁定给定的互斥锁。
如果互斥锁当前已解锁,则它将被调用线程锁定并拥有,并且 pthread_mutex_lock 立即返回。
如果互斥锁已被另一个线程锁定,则 pthread_mutex_lock 将挂起调用线程,直到互斥锁被解锁。
如果互斥锁已被调用线程锁定则行为取决于互斥锁的类型。 如果互斥锁是"fast"类型,则调用线程将被挂起,
直到互斥锁被解锁,从而有效地导致调用线程死锁。 如果互斥锁属于 "error checking" 类型,则 pthread_mutex_lock
会立即返回错误代码 EDEADLK。 如果互斥锁是"recursive" 类型,则 pthread_mutex_lock 成功并立即返回,记录调用
线程锁定互斥锁的次数。
3、int pthread_mutex_trylock(pthread_mutex_t *mutex);//和上一个函数的功能相同
区别在于如果互斥锁已被另一个线程(或者在"fast"互斥锁的情况下由调用线程)锁定,则它不会阻塞调用线程。
相反,pthread_mutex_trylock 会立即返回错误代码。
4、int pthread_mutex_unlock(pthread_mutex_t *mutex);//解锁给定的互斥锁
如果互斥锁属于"fast"类型,则 pthread_mutex_unlock 将返回解锁状态。 如果它是"recursive"类型,则减少互斥锁
的锁定计数(由调用线程对其执行的 pthread_mutex_lock 操作的数量),并且仅当该计数达到零时,互斥锁才真正解锁。
在"error checking"和"recursive"互斥锁上,pthread_mutex_unlock 实际上在运行时检查互斥锁是否在入口处被锁定,
并且它被现在调用 pthread_mutex_unlock 的同一线程锁定。 如果不满足这些条件,则返回错误代码并且互斥锁
保持不变。 "Fast"互斥锁不执行此类检查,因此允许锁定的互斥锁由其所有者以外的线程解锁。 这是不可移植的行为,
不得依赖。
5、int pthread_mutex_destroy(pthread_mutex_t *mutex);//破坏互斥对象
pthread_mutex_destroy 函数用于破坏互斥对象,释放它可能拥有的资源。 必须在入口处解锁互斥锁。
在 LinuxThreads 实现中,没有资源与互斥对象关联,因此除了检查互斥锁是否已解锁外,pthread_mutex_destroy
实际上什么都不做。
对于快速互斥锁pthread_mutex_t类型的变量也可以使用常量PTHREAD_MUTEX_INITIALIZER
对于递归互斥锁pthread_mutex_t类型的变量也可以使用常量PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP
对于错误检查互斥锁pthread_mutex_t类型的变量也可以使用常量PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
mutexattr 中指定的互斥锁属性来初始化 mutex 指向的互斥锁对象,如果mutexattr为空即NULL,则使用默认属性。
二、有关条件变量的函数
1、 int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);//初始化条件变量
当参数cattr为空指针时,函数创建的是一个缺省的条件变量。否则条件变量的属性将cattr中的属性值来决定。调用
pthread_cond_init函数时,参数cattr为空指针等价于cattr中属性为缺省属性,只是前者不需要cattr所占用的内存开销。
这个函数返回时,条件变量被存放在参数cond指向的内存中。
2、 int pthread_cond_signal(pthread_cond_t *cond);//解除在条件变量上的阻塞
函数被用来释放被阻塞在指定条件上的一个线程。
必须在互斥锁的保护下使用新相应的条件变量。否则对条件变量的解锁有可能发生在锁定条件变量之前,从而造成死锁。
唤醒阻塞在条件变量上的所有线程的顺序由调度策略决定,如果线程的调度策略是SCHED_OTHER类型的,系统将根据
线程的优先级唤醒线程。
如果没有线程被阻塞在条件变量上,那么调用pthread_cond_signal()将没有作用。
3、int pthread_cond_broadcast(pthread_cond_t *cond);//释放阻塞的所用线程
函数唤醒所用被pthread_cond_wait函数阻塞在某个条件变量上的线程,参数cond被用来指定这个条件变量。当没有线程
阻塞在这个条件变量上时,pthread_cond_broadcast函数无效。
4、int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);//阻塞在条件变量上
函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cond参数执行的条件变量上。
被阻塞线程可以被pthread_cond_signal函数,pthread_cond_bradcast函数唤醒,也可能在被信号中断后唤醒。
pthread_cond_wait函数的返回并不意味着条件的值一定发生了变化,必须重新检查条件的值。
pthread_cond_wait函数返回时,相应的互斥锁将被当前线程锁定,即使函数出错返回。
一般一个条件表达式都是在一个互斥锁的保护下被检查。当条件表达式为被满足时,线程将仍然阻塞在这个条件变量上。
当另一个线程改变了条件的值并向条件变量发出信号时,等待在这个条件变量上的一个线程或所有线程都被唤醒,接着
都试图在此占有相应的互斥锁。
阻塞在条件变量上的线程被唤醒后,直到pthread_cond_wait()函数返回之前条件的值都有可能发生变化。所以函数返回
以后,在锁定想应的互斥锁之前,必须重新测试条件值。
5、int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct
timespec *abstime);//阻塞到指定时间
函数到了一定的时间,即使条件外未发生也会解除阻塞。这个时间由参数abstime指定。函数返回时,相应的互斥锁往往
是锁定的,即使是函数出错返回
6、int pthread_cond_destroy(pthread_cond_t *cond);//释放条件变量