gpt4 book ai didi

c++11 - 使用 std::mutex 作为类中的成员变量

转载 作者:行者123 更新时间:2023-12-01 18:14:48 41 4
gpt4 key购买 nike

我定义了一个具有 std::mutex my_mutex 的类作为它的私有(private)成员变量。但是当我尝试使用 lock_guard在从不同线程调用的成员函数中,编译器会抛出很多错误。如果我把这个互斥锁放在类之外,它就可以工作。代码如下

class ThreadClass
{
std::mutex my_mutex;
public:
void addToList(int max, int interval)
{

std::lock_guard<std::mutex> guard(my_mutex);
for (int i = 0; i < max; i++)
{
// Some operation
}
}
};


int main()
{
std::thread ct(&ThreadClass::addToList,ThreadClass(),100,1);
std::thread ct2(&ThreadClass::addToList,ThreadClass(),100,10);
std::thread ct3(&ThreadClass::print,ThreadClass());

ct.join();
ct2.join();
ct3.join();
}

如果相同 my_mutex被排除在类之外然后它工作正常。那么当同一个变量在类中并在线程所作用的成员函数中调用时,它是否像静态成员一样对待?

最佳答案

std::thread构造函数复制传递给执行函数的参数。但是std::mutex是不可复制的,所以ThreadClass如果它有这样的成员,则它是不可复制的。

您正在传递一个临时的 ThreadClass反对std::thread ,但您可能希望在所有线程中使用相同的对象。您可以使用 std::ref传递现有对象的引用。以下代码在 GCC 7.1.0 上编译:

#include <thread>
#include <mutex>

class ThreadClass
{
std::mutex my_mutex;
public:
void addToList(int max, int interval)
{
std::lock_guard<std::mutex> guard(my_mutex);
// ...
}
void print()
{
// ...
}
};

int main()
{
ThreadClass obj;
std::thread ct(&ThreadClass::addToList, std::ref(obj), 100, 1);
std::thread ct2(&ThreadClass::addToList, std::ref(obj), 100, 10);
std::thread ct3(&ThreadClass::print, std::ref(obj));

ct.join();
ct2.join();
ct3.join();
}

传递指向对象的指针而不是引用也应该有效:
std::thread ct(&ThreadClass::addToList, &obj, 100, 1);

关于c++11 - 使用 std::mutex 作为类中的成员变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46295352/

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