Tag: mutex

在pthreads中实现FIFO互斥

我正在尝试实现支持并发插入的二叉树(甚至可能在节点之间发生),但无需为每个节点分配全局锁或单独的互斥锁或互斥锁。 相反,分配的此类锁的数量应该是使用树的线程数量级 。 因此,我最终遇到了一种锁定护航问题。 更简单地解释一下,当两个或多个线程执行以下操作时, 可能会发生这种情况: 1 for(;;){ 2锁(互斥锁) 3 do_stuff 4解锁(互斥) 5} 也就是说,如果线程#1在一个“cpu突发”中执行指令4-> 5-> 1-> 2,那么线程#2将从执行中匮乏。 另一方面,如果pthreads中存在用于互斥锁的FIFO类型锁定选项,则可以避免这样的问题。 那么,有没有办法在pthreads中实现FIFO类型的互斥锁? 可以改变线程优先级吗?

检查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; […]

在进程之间共享条件变量和互斥:是否必须先锁定互斥锁?

我需要一些帮助来了解如何在C中使用条件变量来解决练习。 这是一个小例子: #include #include #include #include #include #include #include #include #include #include #define OKTOWRITE “/oktowrite” #define MESSAGE “/message” #define MUTEX “/lock” int main(int argc, char** argv) { pthread_cond_t* condition; pthread_mutex_t *mutex; char* message; int des_cond, des_msg, des_mutex; int mode = S_IRWXU | S_IRWXG; des_mutex = shm_open(MUTEX, O_CREAT | O_RDWR | O_TRUNC, mode); if (des_mutex < […]