类成员函数的地址

时间:2011-09-27 06:08:21

标签: c++ pthreads operands

我有一个名为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);

但是我收到了错误

  

左撇子需要作为一元'&'操作数。

有什么建议吗?

2 个答案:

答案 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收集结果,你需要做更多的工作。