Tag: 死锁

当缓冲区小于生产者的输入时,生产者/消费者似乎陷入僵局

我创建了一个循环缓冲区,其中有多个客户端写入(最后我希望它们将不同大小的消息写入)到缓冲区中。 服务器将它们读出来。 它基于消费者/生产者问题中的代码: #include #include #include #include #include #define BUFFER_SIZE 10 struct cBuf{ char *buf; int size; int start; int end; pthread_mutex_t mutex; pthread_cond_t buffer_full; pthread_cond_t buffer_empty; }; struct cBuf cb; void buf_Init(struct cBuf *cb, int size) { int i; cb->size = size + 1; cb->start = 0; cb->end = 0; cb->buf = (char *)calloc(cb->size, […]

使用条件变量的Pthread程序死锁

该计划正在努力实现的目标: 该程序应该同步“访客”和“汽车”的几个线程。 游客们随意漫步,直到他们决定乘车。 如果他们是第一次乘坐汽车并且有车可以乘坐,那么他们必须等到他们第一次排队或者车回来。 如果没有游客排队,那么汽车会等待,直到游客想要乘车。 更多背景信息: 我使用条件变量重新构建我的线程同步程序,如此处接受的答案中所建议的那样。 我知道我在正确的轨道上,但由于某些原因,我的程序仍然陷入僵局,对于我的生活,我无法弄清楚为什么。 除非我给你代码,否则我不知道你怎么能帮助我,所以这里是: 问题: 1.)一小段后死锁 2.)有时候一位游客首先排队买车,但从不上车。 解决方案: 我的代码中有太多的错误…我想我会修复一个,我经常(不经意间)引入另一个。 我一直在删除程序的function,直到我消除了所有的错误,然后以一种不会使我的程序死锁的方式逐个构建function。 谢谢大家的建议。

fork(应该是)在线程程序中对信号处理程序是否安全?

我真的不确定POSIX在存在线程和信号时对fork的安全性的要求。 fork被列为异步信号安全函数之一,但是如果库代码有可能注册了非异步信号安全的pthread_atfork处理程序,这会否定fork的安全性吗? 答案取决于运行信号处理程序的线程是否正在使用atfork处理程序所需的资源? 或者换句话说,如果atfork处理程序使用同步资源(互斥体等),但是从一个永远不会访问这些资源的线程中执行的信号处理程序调用fork ,程序是否符合要求? 在这个问题的基础上,如果使用pthread_atfork建议的习语在系统库内部实现“线程安全”分叉(获取prefork处理程序中的所有锁并释放父和子postfork处理程序中的所有锁),那么就是fork在线程程序中使用信号处理程序是否安全? 处理信号的线程是否可能在调用malloc或fopen / fclose并持有全局锁的过程中,导致fork期间出现死锁? 最后,即使fork在信号处理程序中是安全的,在信号处理程序中fork然后从信号处理程序返回是安全的,或者在信号处理程序中调用fork总是需要后续调用_exit或其中一个exec信号处理程序返回之前的函数族?