我有一个名为CSum的类,它包含一个静态方法,其标识符是:
static double fileProc(string myFile);
在我的主要功能中,我只需通过
来调用它 CSum::fileproc("foo.txt")
但是,我想在两个单独的文件上调用pthread。因此我需要获取此方法的地址。
我是这样做的 return1 = pthread_create(&t1, NULL, &CSum::fileProc(file1), NULL);
return2 = pthread_create(&t2, NULL, &CSum::fileProc(file2), NULL);
但是我收到了错误
左撇子需要作为一元'&'操作数。
有什么建议吗?
答案 0 :(得分:3)
您不传递参数,只需提供函数的名称即可。您希望它获取的参数是pthread_create
的下一个参数。
而不是
pthread_create(&t2, NULL, &CSum::fileProc(file2), NULL);
DO
pthread_create(&t2, NULL, &CSum::fileProc, file2);
根据需要投射类型。请注意,线程函数应该接受指针作为参数,确保您正确定义它。
答案 1 :(得分:0)
CSum::fileProc(file1)
是一个表达式,它调用函数并为函数返回值作为表达式的值。您正试图获取该值的地址,但您不能这样做。这将无法满足您的需求。
&CSum::fileProc
将为您提供函数指针,但它没有与pthreads一起使用的正确签名。由于pthreads是一个C库,它有一个非常简单的接口。对C ++最好的选择是使用更高级别的C ++库,在下面使用pthread(至少在unixes上),比如boost thread。
如果由于某种原因你不能这样做,你需要编写自己的包装器。要在单独的线程中调用函数,您需要编写类似:
的内容class CSum {
...
static void fileProcWrapper(void* param) {
const char* fileName = (const char*) param;
fileProc(fileName);
}
...
并用
调用它pthread_create((&t2, NULL, &CSum::fileProc, (void*) file1.c_str());
只是给你打电话,介意,结果会被这段代码丢掉。如果你想用pthread_join收集结果,你需要做更多的工作。