如何使用不同的线程访问Singleton类成员功能
How to access Singleton class member functions using different threads?
我尝试使用Singleton实例在不同线程上运行PRINT()和打印(char ch)方法。
任何身体都可以帮助我为什么我会遇到错误: -
错误c3867:'singleton :: print':函数调用丢失参数列表;使用'& singleton :: print'创建一个指针
错误c3867:'singleton :: print':函数调用丢失参数列表;使用'& singleton :: print'创建一个指针
错误c2661:'std :: thread :: thread':没有超载函数为2个参数
还可以帮助我为我纠正以下代码。
class Singleton
{
private:
Singleton()
{}
static Singleton* singletonInstance;
public:
static Singleton* getSingletonInstance();
void print()
{
std::this_thread::sleep_for(std::chrono::milliseconds(500));
for (int i = 0; i < 100000; i++)
{
cout<<i<<endl;
}
}
void print(char ch)
{
std::this_thread::sleep_for(std::chrono::milliseconds(500));
for (int i = 0; i < 100000; i++)
{
cout<<ch<<" "<<i<<endl;
}
}
};
Singleton* Singleton::singletonInstance = nullptr;
Singleton* Singleton::getSingletonInstance()
{
if(!singletonInstance)
singletonInstance=new Singleton();
return singletonInstance;
}
int main()
{
std::thread t1(Singleton::getSingletonInstance()->print);
std::thread t2(Singleton::getSingletonInstance()->print,'T');
t1.join();
t2.join();
return 0;
}
发布的代码有拖曳问题:
1-您传递函数指针到线程的方式是错误的:
std::thread t1(Singleton::getSingletonInstance()->print);
编译器正在抱怨,并给您一个提示,您必须如何将功能指针传递给线程。它说:使用'&amp; singleton :: print'以创建指向成员的指针
也必须以以下方式传递函数指针:
std::thread t1(&Singleton::print);
step2:设置Sigleton类的对象,函数指针属于。
std::thread t1(&Singleton::print, Singleton::getSingletonInstance());
但是,只有在您没有超载函数打印的情况下才能起作用,因为编译器找不到答案,您愿意打电话给哪个打印。
现在我们遇到了第二个问题:如何解决过载功能的问题?
您有可能:
1-您在铸造的帮助下告诉编译器,您要致电哪个功能:
int main()
{
using print1 = void (Singleton::*)();
using print2 = void (Singleton::*)(char);
std::thread t1(print1(&Singleton::print), Singleton::getSingletonInstance());
std::thread t2(print2(&Singleton::print), Singleton::getSingletonInstance(), 'T');
t1.join();
t2.join();
return 0;
}
2-您使用lambda功能并直接调用该功能:
int main()
{
auto *s = Singleton::getSingletonInstance();
std::thread t1([&s](){s->print();});
std::thread t2([&s]() {s->print('T');});
t1.join();
t2.join();
return 0;
}
第二个更聪明,更容易理解
首先,您将线程中的函数称为错误。您需要通过成员函数print
的 address ,然后是指向单顿指针 - 然后是参数(如果有)。
std::thread(&Singleton::print, Singleton::getSingletonInstance());
第二,因为您要调用一个超载函数,因此需要 cast 地址的地址 to Cright to Cright offloaded类型。
// call the char version
std::thread(static_cast<void(Singleton::*)(char)>(&Singleton::print), Singleton::getSingletonInstance(), 'T');
类似的东西:
class Singleton
{
private:
Singleton()
{}
static Singleton* singletonInstance;
public:
static Singleton* getSingletonInstance();
void print()
{
std::this_thread::sleep_for(std::chrono::milliseconds(500));
for (int i = 0; i < 100000; i++)
{
cout<<i<<endl;
}
}
void print(char ch)
{
std::this_thread::sleep_for(std::chrono::milliseconds(500));
for (int i = 0; i < 100000; i++)
{
cout<<ch<<" "<<i<<endl;
}
}
};
Singleton* Singleton::singletonInstance = nullptr;
Singleton* Singleton::getSingletonInstance()
{
if(!singletonInstance)
singletonInstance=new Singleton();
return singletonInstance;
}
int main()
{
std::thread t1(static_cast<void(Singleton::*)()>(&Singleton::print), Singleton::getSingletonInstance());
std::thread t2(static_cast<void(Singleton::*)(char)>(&Singleton::print), Singleton::getSingletonInstance(), 'T');
t1.join();
t2.join();
return 0;
}
另外,您可以通过lambda表达式调用单身人的功能,这实际上使事情变得容易得多:
std::thread t1([]{Singleton::getSingletonInstance()->print();});
std::thread t2([]{Singleton::getSingletonInstance()->print('T');});
参见lambda表达式。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 如何使用不同的线程访问Singleton类成员功能
- singleton--cpp文件中无法识别的静态成员
- 访问类似singleton的静态成员的seg错误
- Singleton - Impl.使用静态类成员vs.静态成员变量