0

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

但我得到一个错误

需要作为一元“&”操作数的左值。

有什么建议么?

4

2 回答 2

3

您不传递参数,只需给出函数的名称。您希望它获取的参数是pthread_create.

代替

pthread_create(&t2, NULL, &CSum::fileProc(file2), NULL);

pthread_create(&t2, NULL, &CSum::fileProc, file2);

根据需要转换类型。请注意,线程函数应该接受指针作为参数,请确保正确定义它。

于 2011-09-27T06:10:44.000 回答
0

CSum::fileProc(file1)是一个表达式,它调用函数并为您提供函数返回的值作为表达式的值。您正在尝试获取该值的地址,这是您无法做到的,这不会做您想要的。

&CSum::fileProc将为您提供函数指针,但它没有与 pthread 一起使用的正确签名。由于 pthreads 是一个 C 库,它有一个非常简单的接口。对于 C++,最好的选择是使用更高级别的 C++ 库,该库在下面使用 pthreads(至少在 unix 上),比如 boost 线程。

如果由于某种原因你不能这样做,你需要编写自己的包装器。要在单独的线程中调用您的函数,您需要编写如下内容:

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 收集结果,你必须做更多的工作。

于 2011-09-27T06:31:30.090 回答