mutex 相关问题

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

为什么我的程序在没有线程的情况下运行良好,但在添加线程时却表现异常?

我的程序模拟 grep 命令的行为。即执行./main grep 时,会使用缓冲区逐行查找,并写入行号...

回答 1 投票 0

将异步闭包应用于互斥体内容的组合器?

在我的想法中,run 函数无法编译,因为闭包的返回类型取决于可变引用的生命周期。我无法表达 F 的正确界限,这会 f...

回答 0 投票 0

多线程单生产者多消费者错误

我的生产者和消费者实施使用互斥锁和条件变量时遇到问题。 问题是程序有时永远不会完成,有时会完成,但消耗了

回答 0 投票 0

pthread_cond_wait()如何与mutex解耦?

我一直在思考条件变量背后的逻辑,并且对与之相关的最常见问题感到满意。 基本上,如果我们做类似的事情: mutex.lock() whi...

回答 1 投票 0

想不出怎么用python写两个老师的线程队列

我被分配了一个任务:创建一个项目“Laboratory work”,模拟学生交付实验室作业。 在课程开始时,假设学生接受实验室...

回答 1 投票 0

在 java.lang.Object kotlin.SynchronizedLazyImpl.getValue()(LazyJVM.kt:69) waiters=5

我读过这可能是“所有者方法的长时间监视器争用事件”的原因? 它说我应该查看要求锁定的位置。所以,它是 kotlin stdlib 的 LazyJVM.kt:69。 这是

回答 0 投票 0

使用互斥锁解决有界缓冲区问题

这里是新手。我正在对 C 编程中的有界缓冲区问题进行分配。我尽可能不使用库来更好地理解解决方案。 到目前为止我有这个 #包括...

回答 1 投票 0

C 信号量如何提供互斥(内部)?

我知道这个理论以及为什么使用它们,问题是针对它的内部功能,因为我认为信号量只不过是一个全局变量或文件,SO如何管理

回答 0 投票 0

c++中的条件变量,我该如何正确使用它们?

我正在尝试实现一个工作对象(这是一个等待任务并仅在销毁时终止的线程),但我在使用 std::condition_variable 时遇到了问题: #包括 我正在尝试实现一个工作对象(这是一个等待任务并仅在销毁时终止的线程),但是我在使用std::condition_variable: #include <thread> #include <mutex> #include <condition_variable> #include <functional> #include <atomic> #include <iostream> class Worker { public: Worker(Worker&&) = delete; Worker(const Worker&) = delete; Worker() : stop(false) , thread(&Worker::worker_thread, this) {} void push(std::function<void()> _f) { std::unique_lock lock(thread_mutex); task = std::move(_f); new_task.notify_one(); } ~Worker() { /* not implemented yet */ } private: void worker_thread() { std::unique_lock lock(thread_mutex); while (true) { new_task.wait(lock); if (stop) return; task(); } } std::atomic<bool> stop; std::function<void()> task; std::thread thread; std::mutex thread_mutex; std::condition_variable new_task; }; 我在这里想出了这个目前不适用于 gcc 的例子: int main() { Worker t; t.push([] { std::cout << "Hello from worker" << std::endl; }); for (int i = 0; i < 10; ++i) t.push([i] { std::cout << i << std::endl; }); return 0; } 如果运行代码我得到这个输出: terminate called without an active exception //(because destructor yet to be implemented) 9 9 9 9 9 . . . and so on 9 所以这是我的代码应该如何工作: 当构造一个Worker对象时,它会产生一个执行worker_thread函数的线程。 此函数锁定thread_mutex,并且应该仅在等待条件变量时将其解锁。 当一个任务被推送时,push 函数会尝试锁定互斥量,它应该只在它可以的时候,也就是当 worker_thread 正在等待带有条件变量的任务时。 所以如果线程正在等待,push应该能够获取锁并在task缓冲区中移动新任务,然后通知条件变量,唤醒线程。 一个提示是这段代码: int main() { Worker t; t.push([] { std::cout << "Hello from worker" << std::endl; }); //for (int i = 0; i < 10; ++i) // t.push([i] { std::cout << i << std::endl; }); return 0; } 永远打招呼,有时它会崩溃,但应该只打印一次然后等待下一个任务。 这更奇怪,因为我最初的想法是一个接一个地执行多个推送会出现问题,也许这可能会导致锁出现一些问题,但在最后一个示例中,我只调用了一次push 并且仍然我有问题。 有人能明白问题出在哪里吗? 阅读有关初始化顺序的信息。当 thread_mutex 和 new_task 尚未初始化时,您运行一个线程。使用未初始化的成员运行 worker_thread 是未定义的行为。 Worker 构造,推送任务,销毁可以在线程工作者启动之前发生,并且工作者永远等待条件变量。您应该首先使用相反方向的条件变量来向构造函数发出有关正在运行的工作人员的信号。 这是适用于两个示例的解决方案: class Worker { public: Worker(Worker&&) = delete; Worker(const Worker&) = delete; Worker() : stop(false) , task(nullptr) , thread(&Worker::worker_thread, this) {} void push(std::function<void()> _f) { std::unique_lock lock(thread_mutex); cv.wait(lock, [this] { return !task; }); task = std::move(_f); new_task.notify_one(); } ~Worker() { std::unique_lock lock(thread_mutex); cv.wait(lock, [this] { return !task; }); stop = true; new_task.notify_one(); lock.unlock(); if (thread.joinable()) thread.join(); } private: void worker_thread() { std::unique_lock lock(thread_mutex); while (true) { cv.wait(lock, [this] { return task || stop; }); // if (stop) return; task(); task = nullptr; // reset task for check new_task.notify_one(); } } bool stop; // does not need to be atomic std::function<void()> task; std::mutex thread_mutex; std::condition_variable cv; std::thread thread; // moved to bottom }; 我遇到的主要问题是我不明白条件变量是如何工作的。 条件变量不等待信号,它等待条件。 所以偶尔条件变量会“唤醒”线程,检查条件是否满足是用户的责任。 使用条件变量时,检查条件很重要,否则它会时不时地唤醒并运行之后的操作。 所以这样做的一种方法是: while (!condition) cv.wait(lock); 或者这个,使用 lambdas: cv.wait(lock, [] { return condition; }); 所以cv.notify_one()只是一个条件可能已经改变的提示,而不是唤醒线程的命令。 此外,我必须小心初始化,因为在我之前的代码中,线程是在条件变量和互斥锁之前初始化的,在这种情况下是否有所不同尚不清楚,它可能确实如此。 成员变量按照声明的顺序进行初始化。 最后,我还需要检查push 和析构函数中的另一个条件。我需要在两者中都看到任务无效,或者设置为 0 或 NULL. 这是因为如果设置为NULL,就意味着push函数可以安全的修改worker_thread未使用的任务。 析构函数做类似的事情,它需要在销毁之前查看线程是否执行完最后一个任务,将stop标志设置为true, 那是因为工作人员在执行任务之前检查是否设置了标志。 就这些,谢谢大家的热心帮助,希望这个问题对所有需要了解条件变量的程序员有所帮助

回答 2 投票 0

如何使 Flutter 桌面应用程序成为单实例?

我有一个 Flutter 桌面应用程序,想防止它的多个实例同时运行。为此,我尝试使用 package:mutex 中的 Mutex,但它不起作用。任何人都可以

回答 0 投票 0

在 Dart 中使用互斥量

我有一个 flutter 桌面应用程序,想防止它的多个实例同时运行。我尝试为此使用 Mutex,但代码不起作用。谁能纠正它...

回答 0 投票 0

我的工作线程实现 c++ 中有这个死锁问题

我正在尝试实现一个工作对象,它是一个等待任务并仅在销毁时终止的线程: #包括 #包括 #包括 #

回答 2 投票 0

单个作者和多个读者的单次写入并发

NOTE:本题与其他并发题不同的是,不仅writer是单一的,而且write操作严格发生一次。 Go to 中有什么同步方法...

回答 1 投票 0

在消费者-生产者问题中我应该把阅读条件放在哪里?

假设我有两种生成器,一种通过读取文本文件(偶数集)生成数据,另一种使用 rand() 函数生成奇数。 现在我想要两种消费者

回答 0 投票 0

Rust 中 `ndarray` `Array2<f64>` 值的并行计算

我正在尝试加快计算速度,但我不确定如何最好地使用 .into_par_iter() 或 ndarray crate 中的一些 Zip:: 选项,以便“正确”并行化

回答 1 投票 0

使用互斥多线程时,在 Form1 上更新进度条

我正在尝试在将数据写入 MS Access 数据库时更新进度条。为了使写入数据库的速度更快。我已经将数据表中的数据分成批次......

回答 0 投票 0

我可以在同一线程中共享 shared_lock 和 unique_lock 之间的互斥量吗?

考虑以下功能: std::shared_mutex 互斥; 无效的 foo() { std::shared_lock readLock{ mutex }; // ... // 函数的只读部分 // ... { 标准::

回答 2 投票 0

go 例程同步失败

我试图在 golang 中实现一个速率限制器。我使用的算法是滑动窗口。 方法 我正在使用地图来存储特定秒内的请求数。所以当一个新的请求到来时,我...

回答 0 投票 0

Python 脚本没有创建足够的输出行

我需要在 Python 中使用多处理将 1,000,000 个随机数写入单个文件,并注意它如何影响执行时间。出于某种原因,每当我运行脚本时,我只会结束......

回答 0 投票 0

C++ std::thread 和 std::mutex 应用程序崩溃(程序异常终止)

我有一个 C++Builder VCL DLL 项目,我的窗体上有一个计时器。计时器调用一个函数,该函数创建一个新的 std::thread(分离),thread_function 调用其他函数并执行

回答 0 投票 0

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