【问题标题】:exiting the program in a multi-threades program在多线程程序中退出程序
【发布时间】:2011-04-08 00:03:12
【问题描述】:

我正在编写一个使用 POSIX 线程库的程序。我正在执行一些系统调用的返回值,例如:

if (pthread_join(temp, NULL) != 0) {  
    cerr << "system error\n" << endl;  
    exit(1);  
}  

我希望程序在通过此 if 条件时立即退出,但是当 cpu 决定在“exit(1)”命令之前切换到不同的线程时可能会出现问题。
有没有办法保护这种情况?

为此使用特殊的互斥锁无济于事,因为: 1. 我有很多这样的调用,并且锁定每个调用会使代码变得非常缓慢、低效,而且大多数情况下 - 非常难看! 2.每个互斥体都需要自己的返回值检查!所以这显然不能解决最初的问题..
有什么帮助的想法吗?

【问题讨论】:

  • 为您格式化了代码。将来,请花时间自己做这件事。我只花了大约 3 秒。
  • 您能解释一下比赛条件吗?我认为这里显示的内容没有任何问题。即使内核确实切换了,它也会回来并且程序将(最终)退出。这是非常不稳定或时间敏感的事情吗?
  • @Jenna 请解释为什么需要防止潜在的上下文切换。
  • @JohnDibling:以后请多花3秒多一点,好好做。
  • @Chris:问题是,如果我在加入或解锁时遇到故障,而不是继续运行一段时间 - 我有时会遇到段错误或死锁,因为程序是不适合跑步 - 这就是为什么我首先退出......

标签: c++ pthreads exit


【解决方案1】:

使用 GCC atomic 写入常用变量。每个线程都应该定期检查这个变量。如果这个变量被改变,退出线程。当所有其他线程都完成后,主线程才会退出。

One more link.

【讨论】:

  • 问题是调度器可能会把我带到不同线程代码中的任何地方..所以我不能只在每个代码行之前检查这个变量..
  • @Jenna:在这种情况下:用于通过原子更改公共值并将pthread_exit 用于所有退出点。策略是一样的:如果标记变量不为空,所有其他线程都应该以同样的方式退出。如果所有线程都退出,应用程序也退出。
  • 你甚至不需要使用原子,使用普通的普通全局也一样。原子性只对并发很重要,在这种情况下没有。每隔一段时间检查一次全局(例如,在工作线程中,每次从队列中拉出任务之前)通常都很好。如果这还不够好,您仍然可以为每个线程安装一个信号处理程序并使用pthread_kill 向每个线程发送一个信号(最好不要使用 SIGTERM,因为这会终止整个进程)。
【解决方案2】:

看起来有一个答案,但我不知道它的效果如何(即如果程序已经出现问题,这可能会或可能不会起作用)。

Can I prevent a Linux user space pthread yielding in critical code?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多