这是一个非常具体的问题,但我想知道是否有人在与多个消费者(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/