簡體   English   中英

無法以 callable 作為參數啟動 C++ std::thread

[英]Can't start C++ std::thread with callable as argument

我想在程序中設置以下類:

  • 一個實現緩沖區的類。 這個緩沖區在滿時會產生一個線程,該線程進行回調來處理如何處理滿緩沖區。
  • 包含緩沖區對象的類。 實現回調函數。

我在生成運行回調的 std::thread 時遇到了一些麻煩。 好像我弄錯了它的參數,但我想不通。

最小的可重現示例:

#include <thread>

class MyClass;

class CallbackClass
{
    public:

        void (MyClass::*callback)();
        std::thread a_thread;

        void setCallback(void (MyClass::*cb)())
        {
            callback = cb;
        }

        void writeCall()
        {
            a_thread = std::thread(callback); // error here
        }
};

class MyClass
{
    public:

        CallbackClass callbackobject;

        MyClass()
        {
            callbackobject.setCallback(&MyClass::bufferWriter);
        }

        void bufferWriter(){}
};

int main(){}

我得到的編譯器錯誤:

error: no matching function for call to ‘std::thread::_Invoker<std::tuple<void (MyClass::*)()> >::_M_invoke(std::thread::_Invoker<std::tuple<void (MyClass::*)()> >::_Indices)’
  operator()()

在這一行:

a_thread = std::thread(callback); // error here
void (MyClass::*callback)();

這是一個指向類方法的指針。

a_thread = std::thread(callback);

類方法不是可以被自身調用的函數。 類方法需要一個對象來調用它。 您需要從某處存儲或獲取指向MyClass對象的指針。 例如,您可以將第二個參數傳遞給 setCallback:

void setCallback(void (MyClass::*cb)(), MyClass *ptr)

然后把它藏在某個地方,然后用它來調用類方法。 通常,這將類似於:

a_thread = std::thread(callback, ptr);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM