gpt4 book ai didi

c++ - 自制范围锁不锁定

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:59:36 26 4
gpt4 key购买 nike

我为我无法访问任何现代 C++ 线程库(如 boost)的项目创建了以下代码。我的愿望是能够在锁离开作用域时自动释放锁。

共享锁工作正常。如果一个线程获取了它,那么在第一个线程释放它之前,没有其他线程可以获取它。但是 Scoped 不起作用。

这里有一些输出显示了我的意思。我给每个线程一个不同的名称,让它们用相同的共享锁实例化 Scoped 锁,打印“已获取”,休眠五秒钟,打印“已发布”,然后离开范围。我没有得到我期望的获取/释放对,而是快速连续地得到四个“获取”,间隔五秒,然后是“释放”。我什至将 Scoped 中的锁更改为指针,并在获取地址之前打印地址,以确保我没有发疯。它看起来像是同一个共享对象,但锁并没有阻止多次访问。

Lock '140734928395200'.
acquired: !!!!!
Lock '140734928395200'.
acquired: -------
Lock '140734928395200'.
acquired: ***************
Lock '140734928395200'.
acquired: ##
released: !!!!!
released: -------
released: ***************
released: ##

这是 Lock.h 的源代码:

#include <pthread.h>
namespace Lock
{
class Shared
{
public:
Shared()
{
::pthread_mutex_init(&(this->mutex), nullptr);
}
~Shared()
{
}
void acquire()
{
::pthread_mutex_lock(&(this->mutex));
}
void release()
{
::pthread_mutex_unlock(&(this->mutex));
}
private:
pthread_mutex_t mutex;
};
class Scoped
{
public:
Scoped(Lock::Shared& lock) : lock(lock)
{
this->lock.acquire();
}
virtual ~Scoped()
{
this->lock.release();
}
private:
Lock::Shared& lock;
};
};

这是我用于测试的 main.cc 文件。我正在构建:

g++ -std=c++11 -o try -pthread main.cc && ./try

在最新的 Ubuntu 系统上使用 g++4.7。

#include <pthread.h>
#include <iostream>
#include "Lock.h"
#include <unistd.h>
struct data
{
data(std::string name, Lock::Shared& lock) : name(name), lock(lock) { ; }
std::string name;
Lock::Shared& lock;
};
void* doStuff(void* v)
{
data* d = (data*)v;
for (int i = 0; i < 5; i++)
{
Lock::Scoped(d->lock);
//d->lock->acquire();
std::cout << "acquired: " << d->name << std::endl;
::sleep(5);
std::cout << "released: " << d->name << std::endl;
//d->lock->release();
::sleep(1);
}
}
int main(int argc, char* argv[])
{
pthread_t fred;
pthread_t barney;
pthread_t wilma;
pthread_t betty;
Lock::Shared lock;
data f("##", lock);
data b("***************", lock);
data w("-------", lock);
data e("!!!!!", lock);
::pthread_create(&fred, nullptr, doStuff, (void*)&f);
::pthread_create(&barney, nullptr, doStuff, (void*)&b);
::pthread_create(&wilma, nullptr, doStuff, (void*)&w);
::pthread_create(&betty, nullptr, doStuff, (void*)&e);
::pthread_join(fred, nullptr);
::pthread_join(barney, nullptr);
::pthread_join(wilma, nullptr);
::pthread_join(betty, nullptr);
return 0;
}

最佳答案

问题是:

for (int i = 0; i < 5; i++)
{
Lock::Scoped(d->lock);

它创建了一个临时数组 Lock::Scoped,它会立即构造和销毁,因此它没有预期的同步效果。更改为:

for (int i = 0; i < 5; i++)
{
Lock::Scoped lk(d->lock);

关于c++ - 自制范围锁不锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15218775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com