pthread_join是否需要返回线程函数?

时间:2017-11-01 00:36:08

标签: c multithreading pthreads

int main()
{
    pthread_t thread;
    int a = 0;

    while(a == 0)
    {
        accept(...); //accept a new connection (blocking)
        pthread_create(&thread, NULL, threaded_function, &a);
    }
    pthread_join(...);
    return 0;
}

我的目标是保持主线程循环,直到线程返回a不等于零。问题是pthread_create没有返回值。我猜这是因为主线程不在pthread_join等待,而是在等待accept的循环中。但是如果我加入循环内部的线程,循环就不会运行。是通过创建另一个线程来实现这一目的的唯一方法,另一个线程函数只是为了观察a的值吗?

1 个答案:

答案 0 :(得分:1)

你的问题是你的主线程卡在接受中这是一个阻塞调用,所以为了突破它,最好发送一个会导致中断的信号。 IIRC这样的事情应该有效。在你的工作线程中:

void* sthread(void* p)
{
  int* keep_running = (int*)p;
  sigset_t set;
  sigemptyset(&set);
  sigaddset(&set, SIGTERM);
  pthread_sigmask(SIG_BLOCK, &set, NULL);
  sleep(5);
  *keep_running = 0;
  pthread_kill(main_threadId, SIGTERM);
}

然后在你的主线程中:

struct sigaction sa;
int keep_running = 1;
...
main_threadId = pthread_self();
sa.sa_handler = signal_handler; //This can be just an empty function
sigaction(SIGTERM, &sa, NULL);
...
while(keep_running)
{
    sock = accept(sock_desc, (struct sockaddr *)&client, (socklen_t*)&c);
    pthread_create(&thread, NULL, sthread, &keep_running);
}
close(sock);

这将允许您干净地关闭插座并整理。当然,您可能希望拥有多个套接字,因此您必须以数组或其他方式管理它们。