pthread_cond_wait作用?

C语言 码拜 9年前 (2016-02-02) 1028次浏览
main线城里:
pthread_mutex_lock(&mutex);
data[count++] = i;
if (count == N) pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
这块代码没看懂,主线城不释放lock,那么thread_function里的pthread_mutex_lock必然会堵塞,
当主线程释放锁后,子线城才会执行if (count < N)这句代码, 主线程都释放锁了,子线城才会执行,
问一下pthread_cond_wait(&cond, mutext)有什么用呢? main都释放锁了,让你去访问全局变量data数组和
count变量。

#include <stdio.h>
        #include <stdlib.h>
        #include <unistd.h>
        #include <pthread.h>
        #define N 6
        /*初始化互斥锁*/
        pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
        /*初始化条件变量*/
        pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
        void *thread_function(void *);
        int count = 0;
        int data[N];
        int main()
        {
                pthread_t thread_a;
                int i;
        if (pthread_create(&thread_a, NULL, thread_function, NULL) < 0)
                {
                        perror(“fail to pthread_create”);
                        exit(-1);
                }
                while ( 1 )
                {
                        printf(“please input number : “);
                        scanf(“%d”, &i);
                        if (i = = 0) break;
                        pthread_mutex_lock(&mutex);
                        data[count++] = i;
                        if (count == N) pthread_cond_signal(&cond);
                        pthread_mutex_unlock(&mutex);
                        usleep(100000);
                }
                pthread_mutex_destroy(&mutex);
                pthread_cond_destroy(&cond);
        return 0;
        }
        void *thread_function(void *arg)
        {
                while ( 1 )
                {
                        int i, sum;
                        pthread_mutex_lock(&mutex);
                        if (count < N)
                        {
                                pthread_cond_wait(&cond, &mutex);
                        }
                        for (i=0,sum=0; i<N; i++) sum += data[i];
                        printf(“average = %d\n”, sum/N);
                        count = 0;
                        pthread_mutex_unlock(&mutex);
                } // end while
                return NULL;
        }
解决方案:40分
引用

b. 假如cond激活,那么就加锁mutex,并完成此次等待操作,允许执行线程1后续的工作。
这句话建议修改一下,假如cond激活,得分两种:
1. 假如线城1已经获得锁,那就继续保持锁的状态
2. 假如线城1没有拿到锁,才加锁。

感谢提醒。
不过本人又考虑了一下,似乎在合理设计的情况下,不应出现在cond激活的同时,本线程也取得了锁的情况。
这是原因是:
(1) 当第一次调用pthread_cond_wait时,cond是阻塞的,此时本线程会释放锁,同时使线程阻塞在该函数上,会等待激活信号。
(2) 由于(1)的操作,当其他线程发出激活信号时,本线程是必然处于没拿到锁的状态,此时本线程将主动加锁(mutex_lock),并将cond重置为阻塞状态。操作成功后再结束pthrad_cond_wait等待。
(3)由于(2)的操作,在下一次调用pthread_cond_wait之前,mutex锁将始终被本线程占有,其他线程没有机会解除cond的阻塞,所以又回到步骤(1)
在(1)~(3)这个循环中是不可能同时出现“cond激活,而本线程取得锁”的情况(除了pthread_cond_wait内部实现中的那次原子操作)。
假如出现那种情况,可能有两个原因:
1. 在其他线程中过早地调用了pthread_cond_signal,其他线程先激活了cond,而本线程还没来得及开始第一次cond_wait调用。
2. 其他线程在没先加锁的情况下直接调用了cond_signal。
假如出现以上两种行为,那么将可能导致无法预期的结果,在程序设计时就一定要避免。
=======================
另外,本人在4楼贴的代码有bug,最初本人只设计了一个【工作者线程】,生成随机数时用了rand()。后来考虑支持多个【工作者线程】,改换成了多线程安全的rand_r(&seed); 贴代码时忘了改main()函数中的初始化种子的部分了。
需要将第52行的 srand(time(NULL)); 修改为
seed = time(NULL);
本人另外写了一个实现多个工作者线程的完整版本,并修复了很多bug。
详见: http://bbs.csdn.net/topics/391922234


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明pthread_cond_wait作用?
喜欢 (0)
[1034331897@qq.com]
分享 (0)