c - 第一个线程信号未被捕获,所有其他线程信号被捕获

标签 c multithreading

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

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);
      }

最佳答案

我不相信前面的答案可以解决问题,因为这两个操作都是在临界区内执行的。

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

关于c - 第一个线程信号未被捕获,所有其他线程信号被捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1824201/

相关文章:

c - atoi() 返回奇怪的值

multithreading - 如何强制主线程等待其所有子线程在 Haskell 中完成

android - 等待 RxJava 响应

Java并行同步2个线程

c - char * 返回值的函数

c - brk 和 sbrk 代表什么?

无法理解这个错误

c# - 如何从我的 C 代码调用 C# dll 中的方法?

java - 具有无界队列的 ThreadPoolExecutor 不创建新线程

python - 从另一个线程或进程更新 Gtk.ProgressBar