gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:53:46 28 4
gpt4 key购买 nike

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不等于0。问题是 pthread_create 没有返回值。我猜测这是因为主线程没有在 pthread_join 处等待,而是在 accept 处等待循环。但是,如果我将线程加入循环内,则循环将不会运行。完成此任务的唯一方法是创建另一个线程和另一个线程函数来观察 a 的值吗?

最佳答案

你的问题是你的主线程被困在accept中,这是一个阻塞调用,因此要让它摆脱它,最好发送一个会导致中断的信号。 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);

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

关于c - 线程函数返回是否需要 pthread_join?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47046547/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com