如何使用不同的线程访问Singleton类成员功能

How to access Singleton class member functions using different threads?

本文关键字:Singleton 成员 功能 访问 线程 何使用      更新时间:2023-10-16

我尝试使用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表达式。