【问题标题】:Is pthread_join necessary for the threaded function to return?线程函数返回是否需要 pthread_join?
【发布时间】:2018-04-13 06:43:18
【问题描述】:
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 的值吗?

【问题讨论】:

  • 线程同步是通过条件变量完成的,它们对你有用吗:stackoverflow.com/questions/8901538/…
  • 我忘记了条件变量。我将不得不看看我是否可以重组我的代码以使用它们。希望这能解决问题。
  • 再看这个,我不知道条件变量是否会起作用,因为wait 会阻塞任何线程,包括需要保持循环的主线程。有什么方法可以使用信号通知循环它可以停止循环并退出?
  • 我有点困惑。您的主线程卡在接受中。你的目标是根据另一个线程中发生的事情以某种方式打破接受吗?
  • 我的主线程卡在接受状态,除非建立新连接,然后它会创建一个新线程,然后循环返回接受并等待。如果在threaded_function 中发生任何将a 设置为零的情况,我只想在该线程返回后结束程序(并退出线程)。

标签: c multithreading pthreads


【解决方案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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2012-02-22
    相关资源
    最近更新 更多