pthreads:等到read()返回值> 0

时间:2015-10-12 03:38:43

标签: c multithreading pthreads conditional-statements wait

我正在开发一个客户端程序,它将作为基本的即时通讯工具运行。我正在使用pthread打开一个专门用于等待接收消息和要读取的消息的线程。是否使用pthread_cond_wait正确等待read(sockfd, buffer, 256)大于0?

void *threadRead() {
  while (1) {
    bzero(buffer,256);
    pthread_cond_wait(&buffer_lock, read(sockfd, buffer, 255) > 0);
    n = read(sockfd, buffer, 255);
    printf("%s\n",buffer);
  }
}

你知道我只需要等到read()返回0以上的值才能继续,我无法找到合适的系统来做到这一点。如果有人可以链接一些能让我走上正轨的东西,或者给我一个很棒的提示。

2 个答案:

答案 0 :(得分:1)

没有。 pthread_cond_wait()用于等待一个由其他线程更改的条件。

如果您只想等待read()返回某些内容,请致电read()。除非你特意将套接字标记为非阻塞,否则它将阻塞调用线程,直到有东西返回。

如果read()永远返回0,那么它表示文件结束:这意味着套接字已在远程端关闭,因此永远不会再有读取。

答案 1 :(得分:-1)

您应该使用select(),而不是像这样

int running;
running = 1;
while (running != 0) /* Just in case you want to end the loop, you can */
{
    fd_set rdset;
    struct timeval timeout;

    timeout.tv_sec = NUMBER_OF_SECONDS_TO_WAIT;
    timeout.tv_usec = YOU_CAN_HAVE_MICRO_SECONDS_PRECISION;

    FD_ZERO(&rdset);
    FD_SET(fd, &rdset);
    if (select(fd + 1, &rdset, NULL, NULL, &timeout) == 1)
    {
        ssize_t length;
        char buffer[100];
        length = read(fd, buffer, sizeof(buffer));
        /* use buffer now */
    }
    else
    {
        /* Timed out and still nothing to read */
        /* do something meanwhile and retry if */
        /* you want to.                        */
    }
    running = use_a_function_to_check_this();
}

你可以在不同的线程中使用它,但你需要小心。

非阻塞IO很难,但实施起来并不重要。

还有一件事,这个

n = read(sockfd, buffer, 255);
printf("%s\n",buffer);

可能是未定义的行为,因为显然缓冲区是

char buffer[256];

你可以

n = read(sockfd, buffer, 255 /* or sizeof(buffer) - 1 */);
buffer[n] = '\0';

printf("%s\n",buffer);

确保buffer nul终止。