当前位置:  技术问答>linux和unix

Linux多线程程序中某个线程在加互斥锁后挂掉,系统会死锁吗?

    来源: 互联网  发布时间:2017-04-02

    本文导语:  问题是这个样子的: 多个线程用pthread_mutex_t lock互斥锁并发访问共享数据结构。 其中某个线程在执行完 pthread_mutex_lock(&lock);之后由于某种原因挂了, 使得pthread_mutex_unlock(&lock);未执行。 那么整个系统会产生死锁吗...

问题是这个样子的:
多个线程用pthread_mutex_t lock互斥锁并发访问共享数据结构。

其中某个线程在执行完
pthread_mutex_lock(&lock);之后由于某种原因挂了,
使得pthread_mutex_unlock(&lock);未执行。

那么整个系统会产生死锁吗?
谢谢!

|

实验下:
#include 
#include 
#include 
#include 

using std::bad_alloc;

void *thread(void *arg)
{
printf("in threadn");
throw bad_alloc();

while(true) {
sleep(1);
printf("thread aftern");
}
return NULL;
}

int main(void)
{
pthread_t tid;
void *ret;
pthread_create(&tid, NULL, thread, NULL);
pthread_join(tid, NULL);
printf("after joinn");
return 0;
}

结果:
in thread
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
已放弃 (核心已转储)

线程中抛异常是会终止整个进程的。。
我觉得楼主不用为这种事而操心。
因为据我有限的了解,你说的这种情况,连POSIX标准中都没有对止的解决方案。对我上帖出现的情况就有pthread_cleanup_push/pop的解决方案。
所以你就当他不可能发生就行了。 

|
一般不会出现单个线程挂掉的情况吧,除非程序逻辑上有问题,被线程被别的线程cancel或者自己在不该退出的地方用了pthread_exit了,要挂也是整个进程挂了。
如果真出现这种情况,肯定会死锁了。
楼主可以看看pthread_cleanup_push()/pthread_cleanup_pop()这两个函数,,就是处理LOCK和UNLOCK之间被cancel的情形的。
man pthread_cleanup_push中的一段话:
for example, unlock a mutex
       so that it becomes available to other threads in the process.
...
       A cancellation clean-up handler is popped from the stack  and  executed
       in the following circumstances:

       1. When  a thread is canceled, all of the stacked clean-up handlers are
          popped and executed in the reverse of the order in which  they  were
          pushed onto the stack.

       2. When  a  thread  terminates by calling pthread_exit(3), all clean-up
          handlers are executed as described in the preceding point.   (Clean-
          up  handlers are not called if the thread terminates by performing a
          return from the thread start function.)

       3. When a thread calls pthread_cleanup_pop()  with  a  nonzero  execute
          argument, the top-most clean-up handler is popped and executed.

|
线程挂了进程还能活吗..

    
 
 

您可能感兴趣的文章:

  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 请问Linux核心支持多线程吗?开发库有线程库吗?线程好用吗?(稳定?)
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 求个linux多线程编程的例子,要有线程池的 通用些更好
  • 请问Linux下线程开销为什么这么大?一个线程要占用近10M内存
  • Linux多线程时一些线程分不到时间片
  • 说说windows线程和linux线程的区别?
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • linux下,如何在多线程中每个线程设置一个定时器,在线等,急。。。谢谢
  • 在创建linux线程时为什么会多一个线程?
  • linux如何主动将线程放入到线程调度队列中重新排队?
  • 在linux RH73下为什么单进程只能开1021个线程线程.
  • Linux下如何让主线程挂起一个指定的时间段而子线程继续运行?谢谢
  • LINUX下有没有线程概念,和WIN下线程概念有什么不同,谢谢.
  • linux线程编程问题
  • linux线程最大数,奇怪,怎么只有300?而且线程是用完就没了,不是同时300啊!
  • 跪求:linux下pthread 双线程计算和单线程的运行时间完全相同是为什么?
  • linux线程与进程的问题
  • linux 下子线程不能执行的问题?
  • linux多线程编程的问题
  • linux多线程编程
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux进程同步或互斥
  • 在linux下,如何进行“互斥”和“并发”的控制?
  • linux/unix里的进程互斥问题 ,有关lockf()函数!
  • 请教linux irq 中断能使用mutex互斥锁吗?
  • Linux下使用C++互斥访问文件+消息队列
  • 请教如何在qt-linux环境下两个cpp文件中对同一个数组作读写互斥操作?
  • linux下临界区和互斥锁的关系
  • Linux下多线程互斥问题
  • linux下两块网卡出现互斥,如何解决,急
  • 关于Linux多线程互斥共享资源
  • linux c进程互斥
  • 求助:linux 用户态 线程同步中信号量、互斥量、锁之间的区别?
  • 新手请教一个linux下互斥量访问输出错误的问题
  • 寻求 Linux 进程互斥的方法,谢谢!
  • 在linux中用C语言编程时怎么实现互斥?
  • linux 下互斥锁问题
  • Linux c++ 消费者 生产者 互斥同步 问题
  • Linux线程管理必备:解析互斥量与条件变量的详解
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,