Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类成员函数的地址_C++_Pthreads_Operands - Fatal编程技术网

C++ 类成员函数的地址

C++ 类成员函数的地址,c++,pthreads,operands,C++,Pthreads,Operands,我有一个名为CSum的类,其中包含一个静态方法,其标识符为: static double fileProc(string myFile); 在我的主要功能中,我只需通过 CSum::fileproc("foo.txt") 但是,我想在两个单独的文件上调用pthreads。因此,我需要获取此方法的地址。我是这样做的 return1 = pthread_create(&t1, NULL, &CSum::fileProc(file1), NULL); return2 = p

我有一个名为CSum的类,其中包含一个静态方法,其标识符为:

 static double fileProc(string myFile);
在我的主要功能中,我只需通过

 CSum::fileproc("foo.txt")
但是,我想在两个单独的文件上调用pthreads。因此,我需要获取此方法的地址。我是这样做的

 return1 = pthread_create(&t1, NULL, &CSum::fileProc(file1), NULL);
 return2 = pthread_create(&t2, NULL, &CSum::fileProc(file2), NULL);
但我犯了个错误

一元'&'操作数所需的左值


有什么建议吗?

您不需要传递参数,只需给出函数的名称即可。您希望它获取的参数是
pthread\u create
的下一个参数

而不是

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


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

如果不传递参数,只需给出函数的名称。您希望它获取的参数是
pthread\u create
的下一个参数

而不是

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

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

CSum::fileProc(file1)
是一个调用函数并将函数返回的值作为表达式值提供给您的表达式。您正试图获取该值的地址,但您无法获取该地址,而这不会满足您的需要

&CSum::fileProc
将为您提供函数指针,但它没有用于pthreads的正确签名。因为pthreads是一个C库,所以它有一个非常简单的接口。你最好的C++应用是使用一个更高级的C++库,它使用的是pPosits(至少在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收集结果,则必须做更多的工作。

CSum::fileProc(file1)
是一个调用函数并将函数返回的值作为表达式值提供给您的表达式。您正试图获取该值的地址,但您无法获取该地址,而这不会满足您的需要

&CSum::fileProc
将为您提供函数指针,但它没有用于pthreads的正确签名。因为pthreads是一个C库,所以它有一个非常简单的接口。你最好的C++应用是使用一个更高级的C++库,它使用的是pPosits(至少在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收集结果,您必须做更多的工作。

很好,我理解。我将要讨论的唯一问题是将file2类型转换为指针,因为file2是一个类型字符串(它保存文件位置)@user966349-是的,这是一个问题。您必须使用指针类型(例如指向
字符串的指针)。很好,我理解。我将要讨论的唯一问题是将file2类型转换为指针,因为file2是一个类型字符串(它保存文件位置)@user966349-是的,这是一个问题。您必须使用指针类型(例如指向
字符串的指针)。返回值很重要,我将尝试执行使其工作所需的操作。如果没有,那么我将修改函数fileProc。感谢您的帮助在处理返回值时,请务必仔细阅读pthreads文档。如果将返回值存储在局部变量中,则不应将指向它的指针传递给pthread_exit。您需要创建一个动态变量(使用new)来存储您的返回值。返回值确实很重要,我将尝试执行使其工作所需的操作。如果没有,那么我将修改函数fileProc。感谢您的帮助在处理返回值时,请务必仔细阅读pthreads文档。如果将返回值存储在局部变量中,则不应将指向它的指针传递给pthread_exit。您需要创建一个动态变量(使用new)来存储返回值。