静音锁定和解锁时间差
Mutex locking and unlocking time difference
我是多线程编程的新手。我有一个简单的测试程序:
#include <mutex>
#include <thread>
#include <iostream>
int main(){
std::mutex mtx;
std::thread t1([&](){
while (true){
mtx.lock();
std::cout << 1 << "Hello" << "n";
mtx.unlock();
}
});
std::thread t2([&](){
while (true){
mtx.lock();
std::cout << 2 << "Hello" << "n";
mtx.unlock();
}
});
t1.join();
t2.join();
}
这是一个非常简单的程序,它以随机的模式打印" 1hello"answers" 2hello",这意味着mutex被一个人解锁,然后由另一个然后以某种随机模式获得并执行。
是否在标准中指定的行为,也就是说,实施是否可以保证它不遵守T1?如果没有,我该如何避免它?
不应保证谁将运行。如果您可以将一个线程的优先级设置高于另一个线程的优先级,则可以保证只有最高优先级线程即可运行。
实际问题是什么?问题在于,此代码以最坏的方式使用多线程。这是一项成就,而且还不错,因为这是一种练习。它要求线程连续运行,在执行长时间操作时锁定并仅为下一个循环解锁,因此实际上没有并行性,只有一场静音的战斗。
如何解决?让螺纹执行一些背景操作,然后停止或让线程等待条件至少让线程偶尔睡觉,并让线程尽可能独立,而不是阻止其他人在可能执行长时间的动作时阻止其他人。<<<<<<<</p>
编辑(小澄清):虽然此代码以最坏的方式使用多线程,但这是一个很好的示例。
相关文章:
- 我应该在锁定TBitmap画布后解锁它吗
- 虚假唤醒是否会解锁所有等待线程,甚至是不相关的线程?
- c++ 为什么我不应该从不同的线程解锁互斥锁
- 在新作用域中使用unique_lock是否等效于在使用共享资源的工作结束时解锁调用
- "data race"(不是真的)在通知条件变量并解锁关联的互斥锁后
- 程序输入密码并解锁窗口7,8,10
- 在通知之前完成手动解锁
- STD :: Mutex如何在不同的线程中解锁
- 如何使用单个解锁方法(可称为读取器或写入器)实现C++读写器锁?
- 如何在C 中自动汇总日志消息并自动解锁互斥X
- 如果我们已经手动解锁了unique_lock,那么破坏时会解锁吗?
- 正在解锁手动未定义/不良设计的锁定guard
- 静音锁定和解锁时间差
- 从C 运行代码后解锁绑定(在R中)的问题
- 在功能返回之前,可以解锁Mutex会增加并发
- 当互斥锁解锁时,它会notify_all或notify_one
- 如何确保在C ++中解锁储物柜?哪种解决方案更好
- 我应该如何在一个功能中锁定wxMutex,并在另一个功能中将其解锁
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 在Qt 5.4中可以对互斥对象进行两次解锁吗