mutex 相关问题

互斥(“互斥”)是一种在多个线程同时访问(特别是更改)相同数据或资源时确保完整性的机制。

Mutex 使用 2 个变量

我正在研究一个由 2 个独立设备组成的系统,这些设备通过“公共内存”交换数据。 为了同步它们,我想使用一个内存位置作为“状态变量”......

回答 1 投票 0

如果线程仅在持有互斥量时使用它,共享变量是否需要可变? [重复]

在 Java 语言规范中的 Java 内存模型 (JMM) 中,如果线程 A 写入一个字段然后解锁互斥量,则写入“发生在”解锁之前。这意味着两个线程

回答 0 投票 0

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

我需要一些帮助来理解如何在 C 中使用条件变量来解决练习。这是一个小例子: #包括 #包括 #包括 我需要一些帮助来理解如何在 C 中使用条件变量来解决练习。这是一个小例子: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #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 < 0) { perror("failure on shm_open on des_mutex"); exit(1); } if (ftruncate(des_mutex, sizeof(pthread_mutex_t)) == -1) { perror("Error on ftruncate to sizeof pthread_cond_t\n"); exit(-1); } mutex = (pthread_mutex_t*) mmap(NULL, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE, MAP_SHARED, des_mutex, 0); if (mutex == MAP_FAILED ) { perror("Error on mmap on mutex\n"); exit(1); } pthread_mutex_init(mutex, NULL ); des_cond = shm_open(OKTOWRITE, O_CREAT | O_RDWR | O_TRUNC, mode); if (des_cond < 0) { perror("failure on shm_open on des_cond"); exit(1); } if (ftruncate(des_cond, sizeof(pthread_cond_t)) == -1) { perror("Error on ftruncate to sizeof pthread_cond_t\n"); exit(-1); } condition = (pthread_cond_t*) mmap(NULL, sizeof(pthread_cond_t), PROT_READ | PROT_WRITE, MAP_SHARED, des_cond, 0); if (condition == MAP_FAILED ) { perror("Error on mmap on condition\n"); exit(1); } pthread_cond_init(condition, NULL ); if (!fork()) { sleep(3); pthread_mutex_lock(mutex); pthread_cond_signal(condition); pthread_mutex_unlock(mutex); printf("son signaled\n"); exit(0); } else { printf("wait on condition\n"); pthread_mutex_lock(mutex); pthread_cond_wait(condition, mutex); pthread_mutex_unlock(mutex); printf("Signaled by son process, wake up\n"); pthread_mutex_destroy(mutex); pthread_cond_destroy(condition); shm_unlink(OKTOWRITE); shm_unlink(MESSAGE); shm_unlink(MUTEX); return 0; } } 问题是进程的父亲继续被锁定,即使在儿子发出信号之后也是如此。一切都在共享内存中(使用shm_open和mmap)所以两个进程的条件应该相同。 在调用 wait 或 signal 之前锁定互斥锁可能是我犯了一个错误吗? 编辑: 感谢所有帮助过我的人。这是标有关键部分的正确代码: #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #define OKTOWRITE "/condwrite" #define MESSAGE "/msg" #define MUTEX "/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 < 0) { perror("failure on shm_open on des_mutex"); exit(1); } if (ftruncate(des_mutex, sizeof(pthread_mutex_t)) == -1) { perror("Error on ftruncate to sizeof pthread_cond_t\n"); exit(-1); } mutex = (pthread_mutex_t*) mmap(NULL, sizeof(pthread_mutex_t), PROT_READ | PROT_WRITE, MAP_SHARED, des_mutex, 0); if (mutex == MAP_FAILED ) { perror("Error on mmap on mutex\n"); exit(1); } des_cond = shm_open(OKTOWRITE, O_CREAT | O_RDWR | O_TRUNC, mode); if (des_cond < 0) { perror("failure on shm_open on des_cond"); exit(1); } if (ftruncate(des_cond, sizeof(pthread_cond_t)) == -1) { perror("Error on ftruncate to sizeof pthread_cond_t\n"); exit(-1); } condition = (pthread_cond_t*) mmap(NULL, sizeof(pthread_cond_t), PROT_READ | PROT_WRITE, MAP_SHARED, des_cond, 0); if (condition == MAP_FAILED ) { perror("Error on mmap on condition\n"); exit(1); } /* HERE WE GO */ /**************************************/ /* set mutex shared between processes */ pthread_mutexattr_t mutexAttr; pthread_mutexattr_setpshared(&mutexAttr, PTHREAD_PROCESS_SHARED); pthread_mutex_init(mutex, &mutexAttr); /* set condition shared between processes */ pthread_condattr_t condAttr; pthread_condattr_setpshared(&condAttr, PTHREAD_PROCESS_SHARED); pthread_cond_init(condition, &condAttr); /*************************************/ if (!fork()) { sleep(10); pthread_mutex_lock(mutex); pthread_cond_signal(condition); printf("son signaled\n"); pthread_mutex_unlock(mutex); exit(0); } else { printf("father waits on condition\n"); pthread_mutex_lock(mutex); pthread_cond_wait(condition, mutex); pthread_mutex_unlock(mutex); printf("Signaled by son process, wake up!!!!!!!!\n"); pthread_condattr_destroy(&condAttr); pthread_mutexattr_destroy(&mutexAttr); pthread_mutex_destroy(mutex); pthread_cond_destroy(condition); shm_unlink(OKTOWRITE); shm_unlink(MESSAGE); shm_unlink(MUTEX); } return 0; } 要在进程之间共享,需要通过正确初始化的属性相应地初始化互斥量:http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setpshared.html #include <pthread.h> ... pthread_mutex_t * pmutex = NULL; pthread_mutexattr_t attrmutex; /* Initialise attribute to mutex. */ pthread_mutexattr_init(&attrmutex); pthread_mutexattr_setpshared(&attrmutex, PTHREAD_PROCESS_SHARED); /* Allocate memory to pmutex here. */ /* Initialise mutex. */ pthread_mutex_init(pmutex, &attrmutex); /* Use the mutex. */ /* Clean up. */ pthread_mutex_destroy(pmutex); pthread_mutexattr_destroy(&attrmutex); (为了本示例的可读性,省略了错误检查) 这同样适用于应该在进程之间共享的条件变量:http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_condattr_setpshared.html #include <pthread.h> ... pthread_cond_t * pcond = NULL; pthread_condattr_t attrcond; /* Initialise attribute to condition. */ pthread_condattr_init(&attrcond); pthread_condattr_setpshared(&attrcond, PTHREAD_PROCESS_SHARED); /* Allocate memory to pcond here. */ /* Initialise condition. */ pthread_cond_init(pcond, &attrcond); /* Use the condition. */ /* Clean up. */ pthread_cond_destroy(pcond); pthread_condattr_destroy(&attrcond); (为了本示例的可读性,省略了错误检查) 另请参阅此答案:https://stackoverflow.com/a/2390670/694576 等待一个条件之前应该有一个 while 语句,像这样: pthread_mutex_lock(mutex); while(!conditionSatisfied) pthread_cond_wait(condition, mutex); pthread_mutex_unlock(mutex); while 信号应该通过以下方式完成: pthread_mutex_lock(mutex); conditionSatisfied = true; pthread_cond_signal(condition); pthread_mutex_unlock(mutex); 是的,必须在pthread_cond_wait之前锁定互斥量,但不必为pthread_cond_signal锁定。如果你回头看看你的代码,你会发现互斥量将被解锁两次,这是错误的标志......孩子也有可能在已被父母破坏的互斥量上调用解锁...... 顺便说一下,睡眠并不能保证父进程会先执行。为了确保这一点,您将需要……一个条件变量……

回答 3 投票 0

如何在 C++ 中将数据初始化保护到一个线程

使用现代 C++ 来拥有一些由一个线程初始化的共享内存的最佳方法是什么,第一个到达这一点,然后由多个线程读取。它需要尽可能轻巧……

回答 3 投票 0

为什么我的 pthread_cond_signal 没有立即唤醒阻塞的线程?

我正在编写一个多线程程序,其中辅助线程在满足条件后运行,即数据结构中存在一定数量的元素。 空白* gc_thread_handler(void *arg) {

回答 1 投票 0

C 互斥量被无限阻塞

所以我必须在 C 中实现一个队列,并使用一个系统来保护它并使其可以通过多个线程访问。 为此,我使用了生产者-消费者逻辑: #包括 #include ...

回答 1 投票 0

等到地图中的值在 Go 中可用

我有一个程序,我基本上有三种情况 - 为键设置值,如果它存在则获取值,或者等到给定键的值可用。我最初的想法——创建一个新类型

回答 3 投票 0

通过互斥体限制窗口进程?

我有一个 Windows 控制台应用程序,它正在查询数据库中的一个表。传递到控制台应用程序的参数包括一个连接字符串和一个在数据库的特定表中找到的值。这个缺点...

回答 0 投票 0

如何使用互斥锁防止多个实例但在不同用户上?

所以基本上我在我的 C# 应用程序中实现了一个互斥锁,它对一个用户非常有效,但是每当我将用户从 admin 更改为 User1 时,我都可以再次启动该应用程序。 使用...

回答 0 投票 0

在 Rust 中为线程同步创建多个互斥锁

我对 Rust 不熟悉。 我尝试编写的程序将在运行时确定 n 的值。 我希望程序具有以下行为:将创建 n 个线程,每个线程...

回答 0 投票 0

Rust,删除变量时锁定互斥锁会导致死锁

我希望这不是太切线,但我认为有必要理解这个问题: 我目前正在用 Rust 编写一个 JIT 来跟踪操作,将它们编译为 spirv 并执行

回答 3 投票 0

std::unique_lock 的分支覆盖率<std::mutex> lock{mtx}

我不知道如何测试以下代码的所有分支。在 gtest 覆盖率中,它显示 unique_lock decleration 和 initialization 有两个分支,但我不知道如何测试我...

回答 0 投票 0

具有指针作为资源的类的析构函数被调用两次 - C++ 中可能存在多线程问题?

我在运行我的C++代码时遇到了运行时错误,在调试它时,我发现类A的析构函数被调用了两次。我不确定为什么会这样。第一个电话是...

回答 0 投票 0

作为C结构成员的mutex锁有什么功能

我有一个包含Plane结构的赋值,它包含一个pthread_mutex_t和一个pthread_cond_t字段。然而,我不明白当我们锁定这个锁或等待这个cond时会发生什么......。

回答 1 投票 -1

跨进程互斥实例化

刚刚写了一个简单的程序,必须一次处理一次,所以通过使用一个特定名称的键控Mutex来实现。静态可读字符串......。

回答 1 投票 1

sync.mutex锁定什么?[重复]

package main import ( "sync" ) type B struct { balance int32 m *sync.RWMutex } var ( a = 100 b = &B { balance:1000, m:&sync.RWMutex{}, } ) func ...

回答 1 投票 -1

细粒度和粗粒度哪个更快?

我是大二的学生,现在学习操作系统这个科目。我想通过实现二进制搜索树和使用mutex来比较细粒度和粗粒度。锁定和解锁是 ...

回答 1 投票 0

C++线程集的Mutex锁。

我知道mutex的基本原理是保护特定的代码路径不被1个以上的线程访问。在我目前的设置中,我有10个A型线程(A1-A10),10个线程 ...

回答 1 投票 2

无法使用书中的例子模拟死锁。

我正在看《Go中的并发性。Katherine Cox-Buday写的 "Concurrency in Go: Tools and Techniques for Developers "一书中,我被一个非常简单的例子卡住了,这个例子是为了模拟死锁。这个片段是这样的。...

回答 1 投票 0

C++多线程--条件变量以错误的方式提供数据。

我有一个多线程项目,我应该创建一个模拟的酒店。我有一个接待员结构,他们的工作是不断地寻找是否有空闲的房间(在 ...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.