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
的值吗?
答案 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);
这将允许您干净地关闭插座并整理。当然,您可能希望拥有多个套接字,因此您必须以数组或其他方式管理它们。