首页 > 代码库 > producer_consumer_problem知识背景
producer_consumer_problem知识背景
一篇很有用的教程:http://www.cnblogs.com/lmule/archive/2010/08/18/1802774.html
1.pthread
参考资料:http://www.cnblogs.com/auleaf/archive/2011/09/19/2181328.html
pthread_create(&threads[i], NULL, sum_part, &ids[i]);
/* extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr, void *(*__start_routine) (void *), void *__arg)); */
/* 第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。 */
pthread_join(threads[i], NULL);
/* 函数pthread_join用来等待一个线程的结束。函数原型为: extern int pthread_join __P ((pthread_t __th, void **__thread_return)); */
/* 第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。 */
pthread_exit(NULL);
2.mutex互斥锁
pthread_mutex_t lock; /* pthread_mutex_t is a structure */
pthread_mutex_init(&lock, NULL); /* API定义如下: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr) ; */
/* 其中mutexattr用于指定互斥锁属性,如果为NULL则使用缺省属性 */
pthread_mutex_lock(&lock);
pthread_mutex_unlock(&lock);
/* 互斥锁属性:
* PTHREAD_MUTEX_TIMED_NP,缺省值,即普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。
* PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。
* PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。
* PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。
*/
3.semaphore信号灯
参考资料:http://www.cnblogs.com/hnrainll/archive/2011/04/24/2026411.html
信号灯的类型为sem_t。在声明后必须调用sem_init()。需要传递两个参数,第一个参数是之前声明的sem_t变量,第二个必须为0。当不再需要信号灯时,必须调用sem_destroy()来释放资源。等待信号灯的操作为sem_wait()。
producer_consumer_problem知识背景