如何在c++中使用/创建unique_lock
How to use/create unique_lock in c++?
有人能解释一下如何在c++中使用和创建unique_lock吗?它应该用于互斥监视器的任何过程,并能够对条件变量执行wait()。。。我没有从文档中理解我应该如何创建它。是否需要一个互斥体?这里有一个伪代码:
/* compile with g++, flags -std=c++0x -lpthread */
#include <condition_variable>
#include <mutex>
#include <thread>
#include <iostream>
#include <string.h>
#include <unistd.h>
class monitorTh {
private:
std::mutex m;
std::condition_variable waitP;
std::condition_variable waitC;
char element[32];
std::unique_lock::unique_lock l;
public:
void produce(char* elemProd) {
l.lock();
if (/*already_present_element*/) {
waitP.wait(l);
}
else {/*produce element*/}
l.unlock();
}
void consume() {
/*something specular*/
}
};
int main(int argc, char* argv[]) {
monitorTh* monitor = new monitorTh();
char prodotto[32] = "oggetto";
std::thread producer([&]() {
monitor->produce(prodotto);
});
std::thread consumer([&]() {
monitor->consume();
});
producer.join();
consumer.join();
}
std::unique_lock
使用RAII模式。
当您想要锁定互斥体时,您可以创建一个类型为std::unique_lock
的本地变量,将互斥体作为参数传递。当构造unique_lock时,它将锁定互斥锁,当它被破坏时,它会解锁互斥锁。更重要的是:如果抛出异常,std::unique_lock
析构函数将被调用,因此互斥锁将被解锁。
示例:
#include<mutex>
int some_shared_var=0;
int func() {
int a = 3;
{ //Critical section
std::unique_lock<std::mutex> lock(my_mutex);
some_shared_var += a;
} //End of critical section
}
使用条件变量的更详细的示例代码:
#include<mutex>
std::mutex(mu); //Global variable or place within class
std::condition_variable condition; //A signal that can be used to communicate between functions
auto MyFunction()->void
{
std::unique_lock<mutex> lock(mu);
//Do Stuff
lock.unlock(); //Unlock the mutex
condition.notify_one(); //Notify MyOtherFunction that this is done
}
auto MyOtherFunction()->void
{
std::unique_lock<mutex> lock(mu);
condition.wait(lock) //Wait for MyFunction to finish, a lambda can be passed also to protects against spurious wake up e.g (lock,[](){return *some condition*})
lock.unlock();
}
std::unique_lock<std::mutex>
在一个单独的std::mutex
对象上持有一个锁。通过在构造函数中传递锁对象,可以将其与互斥对象相关联。除非您另有指定,否则互斥对象将立即被锁定。如果锁对象在被销毁时持有锁,则析构函数将释放锁。因此,std::unique_lock<std::mutex>
对象通常是一个局部变量,在您希望获取锁的位置声明。
在您的情况下,produce()
函数可以这样写:
void produce(char* elemProd) {
std::unique_lock<std::mutex> lk(m); // lock the mutex
while (/*already_present_element*/) { // condition variable waits may wake spuriously
waitP.wait(lk);
}
{/*produce element*/}
// lk releases the lock when it is destroyed
}
请注意,我已经用while
替换了if
,以说明来自wait()
调用的虚假唤醒。
在这种情况下,我认为您所需要做的就是:
m.lock();
// Critical section code
m.unlock();
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 为什么 std::unique 不调用 std::sort?
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 试图在visual studio上用C++创建一个桌面应用程序
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 如何在C++20中创建模板别名的推导指南
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 如何创建一个空的全局类并在启动时实例化它
- 无法创建抽象类的实例
- 链接到自行创建的dll失败
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++类内存结构中创建"spacer"?
- 终端不会为C++文件创建.exe文件吗