在我到目前为止看到的线程中使用方法函数的唯一方法是:
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”? 感谢
答案 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捕获的对象的生命周期。