gpt4 book ai didi

c - 多线程应用程序中的错误处理

转载 作者:太空宇宙 更新时间:2023-11-04 02:04:11 27 4
gpt4 key购买 nike

说一个线程函数看起来像:

void *threadFunc(void *args)
{
if(args == NULL)
{
/*
* Let's assume that this case is a fatal error which
* cannot be recovered from.
*/

fprintf(stderr, "Yikes... demons avoided.\n");
exit(EXIT_FAILURE);
}

// Code to do stuff

return NULL; // Return value does not matter
}

注意:我这里的例子只是我精心设计的一个类比,目的是与我面临的实际问题非常相似。

PS:别担心,我的错误信息在现实中更具描述性。


我看到的情况是,这个 fatal error 有时 被超过 1 个线程检测到。我发现有时,当一个线程检测到此错误并到达 fprintf 时,它会被另一个线程抢占,该线程也检测到相同的错误,并且在到达其 fprintf< 时也会被抢占 等等。

我只是想知道如何处理这种特殊情况,以便当一个线程检测到这个 fatal error 时,它会立即关闭应用程序,这样其他线程在它尝试关闭时不会干扰它应用程序关闭。

我正在考虑将错误检测包围在互斥锁中,如下所示:

void *threadFunc(void *args)
{
lockMutex(mutex);
if(args == NULL)
{
/*
* Let's assume that this case is a fatal error which
* cannot be recovered from.
*/

fprintf(stderr, "Yikes... demons avoided.\n");
exit(EXIT_FAILURE);
}
unlockMutex(mutex);

// Code to do stuff

return NULL; // Return value does not matter
}

这对我来说似乎不太优雅,因为如果检测到故障,应用程序将退出并锁定互斥体。我知道操作系统应该释放所有资源,但这对我来说仍然不太好。

您能否建议我执行此操作的另一种可能更好的方法?我的设计本身有问题吗?

最佳答案

bool deadmanWalking = false;
mutex deathMutex = INIT....

void cleanup()
{
lock(&deathMutex);

if (deadmanWalking)
{
unlock(&deathMutex);
return;
}

deadmanWalking = true;

// cleanup code

unlock(&deathMutex);
exit(EXIT_FAILURE);
}

//.........

if(args == NULL)
{
cleanup();
pthread_exit(...);
}

可以说,最好的解决方案是将错误指示从错误检测线程返回到任何启动它们的线程,并让它有序地取消剩余的线程并进行清理,而不是通过退出从它们下面删除底部。

关于c - 多线程应用程序中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22700123/

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