C++ 类成员函数的地址
我有一个名为CSum的类,其中包含一个静态方法,其标识符为: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
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)来存储返回值。