producer_consumer_problem

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章