【问题标题】:First thread signal is not caught all others caught第一个线程信号没有被捕获到所有其他的被捕获
【发布时间】:2009-12-01 05:38:32
【问题描述】:

一个非常具体的问题,但我想知道是否有人在获取与多个消费者(HTTP Web 服务器)的消费者-生产者关系中捕获的第一个信号时遇到任何问题

for(i = 0; i < num_threads; i++) {
    pthread_cond_init(&condVars[i], NULL);
    if(strcmp(policy,"FIFO") == 0)
        pthread_create(&threadArr[i], NULL, workerFIFO, &condVars[i]);
    else
        pthread_create(&threadArr[i], NULL, workerSFF, &condVars[i]);

}


listenfd = Open_listenfd(port);
    // Producer
while (1) {
    clientlen = sizeof(clientaddr);
    connfd = Accept(listenfd, (SA *)&clientaddr, (socklen_t *) &clientlen);

    pthread_mutex_lock(&mutex);

    while(numRequests == num_buffers)
        pthread_cond_wait(&empty, &mutex);

    if(strcmp(policy,"FIFO") == 0)
        putFIFO(connfd);
    else
        putSFF(connfd);


    numRequests++;
    pthread_cond_signal(&condVars[nextWorker]);

    nextWorker = (nextWorker + 1) % num_threads;
    pthread_mutex_unlock(&mutex);
    printf("%s\n", "Look not dead!!!");

}

    // Consumer
    while(1){
    pthread_mutex_lock(&mutex);
    while(numRequests == 0) {
        printf("%u\n", condVar);
        pthread_cond_wait(condVar, &mutex);
        printf("%s", "caught it");
    }

    printf("%s, %u\n", "Its Workingzz! ZOMGZ!!!", condVar);


    int connfd = buffer[nextOutFIFO];
    nextOutFIFO = (nextOutFIFO + 1) % num_buffers;
    numRequests--;
    pthread_cond_signal(&empty);
    pthread_mutex_unlock(&mutex);
    requestHandle(connfd);

    Close(connfd);
      }

【问题讨论】:

  • 您是只有 1 个消费者,以及几个使用不同条件变量的生产者,还是多个消费者 - 但都使用相同的互斥锁?

标签: c multithreading


【解决方案1】:

我不相信前面的答案能解决问题,因为这两个操作都是在关键部分内执行的。

对于numRequests,我建议使用计数信号量而不是整数。生产者执行sem_post(),消费者执行sem_wait()。第一个从等待中返回的消费者将递减信号量,然后只有在修改共享变量、最小化临界区中的代码以及施加单独的互斥所无法提供的秩序感时才能锁定互斥锁。

【讨论】:

    【解决方案2】:

    我觉得改变生产者中增加“numRequests”的顺序将确保消费者不会错过第一个信号。

    现有序列: 请求数++; pthread_cond_signal(&condVars[nextWorker]);

    建议的顺序: pthread_cond_signal(&condVars[nextWorker]); numRequests++;

    理由: 当消费者进入循环“numRequests == 0”的执行,然后对条件变量执行等待时,“numRequests”可以是非零并且信号尚未发出信号。消费者不会进入循环,因为 'numRequests' 非零并且错过了将由生产者在递增后发出的信号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多