此锁块的工作原理
How this lock block works?
本文关键字:工作 更新时间:2023-10-16
我看到一个头文件如下:
#include <pthread.h>
#define lock(x) if(Lock _lock_=x){}else
class Mutex{
public:
Mutex(){
pthread_mutex_init(&mutex_, 0);
};
~Mutex(){
pthread_mutex_destroy(&mutex_);
};
friend class Lock;
private:
pthread_mutex_t mutex_;
void Lock(){
pthread_mutex_lock(&mutex_);
};
void Unlock(){
pthread_mutex_unlock(&mutex_);
};
};
class Lock{
public:
Lock(Mutex& mutex):mutex_(mutex){mutex_.Lock();};
~Lock(){mutex_.Unlock();};
operator bool() const {
return false;
}
private:
Mutex& mutex_;
};
它定义了一个lock(x)
宏。以下是此宏的使用方式:
...
Mutex mtx;
lock(mtx) {
// critical section
}
...
那么,这个锁定宏是如何工作的呢?为什么呢?
因此,预处理器将就地扩展宏(实质上是将其插入代码中(。所以你的例子变成了:
...
Mutex mtx;
if(Lock _lock_=mtx){}else {
// critical section
}
...
或者,使用一些更好的格式,
...
Mutex mtx;
if(Lock _lock_=mtx)
{
}
else
{
// critical section
}
...
它通过 Lock
类的构造函数锁定互斥体,并且 if()
语句中的表达式总是因为Lock
的operator bool() const
的实现而计算结果为 false
,因此执行else { }
部分中的代码。
我想我还会提到,我会争辩说这是一个......比必要的方法更复杂。在范围开始时声明一个新Lock
并完全取消宏"同样容易"(并且可能更容易理解(。例如,Qt的QMutexLocker就是这样使用的。
我们可以在这里做一些纸面宏扩展:
您的宏 =
#define lock(x) if(Lock _lock_=x){}else
以及它的使用:
Mutex mtx;
lock(mtx) {
// critical section
}
在宏替换后变为:
Mutex mtx;
if(Lock _lock_=mtx)
{
// BLOCK 1
}
else
{
// BLOCK 2
// critical section
}
因此,_lock_
是从 mtx
进行复制分配的,它试图通过调用 pthread_mutex_lock
来锁定互斥锁,如果成功则返回0
,如果互斥锁已经被阻止,则返回阻止。
if
块调用Lock::operator bool()
,它总是返回false
:
运算符 bool(( const { 返回假; }
由于这总是返回false
,所以我标记BLOCK 1
块永远不会被占用,而是调用您的关键部分代码(BLOCK 2
(。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 为什么stream::忽略未按预期工作