将特定对象的方法函数发送给线程

时间:2016-01-29 18:13:06

标签: c++ multithreading

在我到目前为止看到的线程中使用方法函数的唯一方法是:

std::thread t1(&mymethod::myfunction, param1, param2, ...);

如果我理解正确,上面的例子调用通用函数,而不是来自特定对象,这意味着函数根据对象的当前状态不起作用。

那么,如何使用特定对象调用该函数?

通过这种方式,出现错误C3867:

myclass myobj(param);
std:: thread t1(myobj.myfunction, param1, param2, ...);

这是我的具体工作中发生的事情: 我想创建一个具有读写文本文件功能的类,使用线程(RW锁) 我有以下课程:

class readersWriters{
private:
    /*... here are some mutexes to implement readers writers lock... doesn't matter*/
    string _fileName;

public:
    readersWriters(string fileName); //constructor
    /*...*/
    void readLine(int lineNumber); //lineNumber - line number to read
    void WriteLine(int lineNumber, string newLine);//lineNumber - line number to write
}

所以在main函数中,我创建了一个类的对象......

readersWriters one("sample.txt");

如果我像在示例中那样创建调用函数的线程,该函数如何知道要读写的文本?在这里,我没有成功:

//thread that reads from "sample.txt" through object "one"
//thread that writes through object "one"
//etc.

如何让线程在sample.txt中读取和写入对象“one”? 感谢

2 个答案:

答案 0 :(得分:2)

没有比这更简单的了。只需将指针传递给对象作为第二个参数。像这样:

std::thread t1(&mymethod::myfunction, &myobj, param1, param2, ...);

您也可以通过复制传递对象或将其包装在std::ref中,这与传递地址实际上相同。

请记住,当通过指针或std::ref传递时,您承担了从生成的线程访问时确保对象不会被销毁的责任。

答案 1 :(得分:0)

在任何你知道如何为“自由”函数解决某些东西的情况下,你有一个特定对象的成员函数,你可以使用带闭包的lambda创建一个“自由”函数:

struct foo                                                              
{   
   int bar(int i, int j)
    {   
        return i + j;
    }   
}   


int main()
{   
    foo f;
    auto cb = [&f](int i, int j) {
        return f.bar(i, j); 
    };  

    cb(2, 3); 

    return 0;
}   

请注意,您需要处理lambda捕获的对象的生命周期。