gpt4 book ai didi

c - 调用 SIGINT 时终止线程 - C

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:03 27 4
gpt4 key购买 nike

我正在构建一个用 C-UNIX 编写的通用程序(使用 Linux,所以我不关心 BSD 或 WIN 函数),它创建两个线程来处理与服务器的通信。

void init_threads(int socket_desc) {

pthread_t chat_threads[2];

ret = pthread_create(&chat_threads[0], NULL, receiveMessage, (void*)(long)socket_desc);
PTHREAD_ERROR_HELPER(ret, "Errore creazione thread ricezione messaggi");

ret = pthread_create(&chat_threads[1], NULL, sendMessage, (void*)(long)socket_desc);
PTHREAD_ERROR_HELPER(ret, "Errore creazione thread invio messaggi");

}

因为这个程序将从 shell 启动,所以我想实现 CTRL-C 的可能性,所以我使用了这行代码:

signal(SIGINT,kill_handler);
// and its related function
void kill_handler() {
// retrive threads_id
// call pthread_exit on the two threads
printf("Exit from program cause ctrl-c, bye bye\n");
exit(EXIT_SUCCESS);
}

我的问题是如何找出事件处理函数中的线程 ID,调用 pthread_exit 是否正确,还是应该使用其他方法?

最佳答案

不要从信号处理程序调用 pthread_exit()!它不需要异步信号安全,参见signal-safety .

一般来说,您应该尽可能少地在信号处理程序中执行操作。常见的习惯用法是设置一个在主循环中定期检查的标志,例如

volatile sig_atomic_t exitRequested = 0;

void signal_handler(int signum)
{
exitRequested = 1;
}

int main(void)
{
// init and setup signals

while (!exitRequested)
{
// do work
}

// cleanup
}

此外,使用 sigaction()用于安装信号处理程序。参见 signal()出于不使用它的原因。

关于c - 调用 SIGINT 时终止线程 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44629212/

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