Tag: deadlock

为什么克隆系统调用后realloc死锁?

我有一个问题,在clone()syscall之后的某个时候realloc()死锁。 我的代码是: #include #include #include #include #include #include #include #define CHILD_STACK_SIZE 4096*4 #define gettid() syscall(SYS_gettid) #define log(str) fprintf(stderr, “[pid:%d tid:%d] “str, getpid(),gettid()) int clone_func(void *arg){ int *ptr=(int*)malloc(10); int i; for (i=1; i<200000; i++) ptr = realloc(ptr, sizeof(int)*i); free(ptr); return 0; } int main(){ int flags = 0; flags = CLONE_VM; log("Program started.\n"); int *ptr=NULL; ptr […]

检查pthread互斥锁是锁定还是解锁(线程锁定后)

我需要查看一个互斥锁是否在if语句中被锁定或解锁,所以我这样检查它… if(mutex[id] != 2){ /* do stuff */ } 但当我检查它时,gcc给我以下错误: error: invalid operands to binary != (have ‘ptherad_mutex_t’ and ‘int’) 那么如何检查互斥锁是否被锁定? 编辑: 我的问题的一个关键组成部分是我的线程(按设计)在将控制传递给另一个线程后立即锁定自己。 因此,当线程A将控制传递给线程B时,线程A被锁定,线程B执行某些操作,然后当线程B完成时,它将解锁线程A. 这样做的问题是,如果线程B尝试解锁线程A并且线程A尚未完成锁定,则解锁的调用将丢失,线程A保持锁定状态,从而导致死锁。 更新: 我根据caf的建议重新制作了我的程序,但我仍遇到问题。 我已经将我的程序模拟到了尽可能最好的结构caf中,但我现在甚至无法分辨出导致死锁的原因……我在这里创建了一个新问题,寻求我的代码帮助。 以下是caf的建议的可运行版本。 我在线程a的函数中做了一个小的重新排序,没有它,线程a和线程b都会在创建时被锁定,等待一个永远不会改变的条件。 #include int run_a = 0; pthread_mutex_t lock_a = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond_a = PTHREAD_COND_INITIALIZER; int run_b = 0; pthread_mutex_t lock_b = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond_b = PTHREAD_COND_INITIALIZER; […]