C++ pthread_create()调用的函数有多个参数-参数是函数指针

C++ pthread_create()调用的函数有多个参数-参数是函数指针,c++,pthreads,parameter-passing,function-pointers,C++,Pthreads,Parameter Passing,Function Pointers,我的情况与我的相似 我想传递一个函数作为参数和一个整数值。使用简化结构测试案例: void print (int x, int y) { cout << "x = " << x << ", y = " << y << endl; } void *interrupt (struct arg_struct args); struct arg_struct { void (*func)(

我的情况与我的相似

我想传递一个函数作为参数和一个整数值。使用简化结构测试案例:

void print (int x, int y) 
{ cout << "x = " << x << ", y = " << y << endl; }

void *interrupt (struct arg_struct args);

struct arg_struct { 
    void (*func)(int,int);          // Argument 1
    int a;                          // Argument 2
    int b;                          // Argument 3
};  

int _tmain(int argc, _TCHAR* argv[]){ 

    int a = 1700, b = 1000;

    struct arg_struct arguments;

    arguments.func = print;
    arguments.a = a;
    arguments.b = b;

    (*interrupt)(arguments);

    cin.get(); return 0;
}


void *interrupt (struct arg_struct args) {

    void (*func) (int,int) ;

    func =  args.func;
    int x = args.a;
    int y = args.b;

    (*func)(x,y);

    return 0;           // Erfordert Rückgabewert
}
使用

编译器说

invalid conversion from void* (*)(arg_struct*) to void * (*)(void*)
参考
pthread\u create
的最后一个参数


为什么呢?

C++在铸造方面很挑剔

替换
void*InThread\u func(struct arg\u struct*)
by
void*InThread\u func(void*my\u数据)
应该可以解决这个问题

<> p>因为这是C++,我建议使用代码> STD::线程< /代码>是您可用的。

“为什么?”,因为您有一个无效的转换
void*(*)(arg_struct*)
void*(*)(void*)
,也许吧。第三
pthread\u create
(不是最后一个)的参数必须是
extern“C”void*(*)(void*)
。(有些编译器会忽略
外部“C”
的必要性。它们在这方面是不正确的。)所以 你的
InThread\u fnc
(我在你的代码中找不到)一定是什么东西 比如:

外部“C”无效*
InThread\u fnc(void*来自线程创建)
{
arg_struct const*p=static_cast(从线程创建);
(*p->func)(p->IntNumber);
返回空ptr;
}
当然,只有在
pthread\u create
的最后一个参数为 a
arg\u结构*
。这与你的情况相符,但如果你 开始派生:当
您启动的函数强制转换为
Base*
会导致未定义的行为。

现在我使用了std::thread和编译器选项-pthread,它可以正常工作。谢谢你能用几句话告诉我这些方法和实现方法的主要区别吗?您是否可以更自由地使用pthread_t优化代码?
pthread
代表Posix线程。这是一件不可能的事。它是不可移植的(即使Windows似乎有一个pthread端口)<代码>标准::线程是标准的。它可以在编译代码的所有平台上运行。主要区别在于可移植性(和易用性,但这是我的观点)。关于优化自由:您可以从
std::thread
中检索本机处理程序,因此您可以使用
pthread\u t执行任何操作。
@Xaqq Re
std::thread
,“易用性”部分取决于您在线程中执行的操作,并且需要付出一定代价。大多数时候,我也会推荐它们,如果只是为了便于携带,但在有些情况下它们可能并不合适。(例如,对于大型服务器,Unix几乎是唯一的游戏,性能问题可能非常严重。)@JamesKanze,但在Unix上不是用
pthread
实现的
std::thread
?如果是这样,性能差异如何能够大到足以引起注意?会有一个关于这方面的文章的链接,看起来很有趣:)@Xaqq
std::thread
显然会在某个时候使用
pthread\u create
<然而,代码>标准::线程做得更多;它保证了任意参数的值拷贝。这只能在新线程实际开始执行后执行。这意味着在
pthread\u create
之后还有一些额外的同步步骤:可能是一个条件,或者至少是一个互斥。(IIRC,
boost::thread
使用了这个条件。当我需要在没有boost的项目中做类似的事情时,我也想到了这个解决方案。)谢谢。我将在接下来的几天内尝试实施您的解决方案,以获得更深入的了解。
g++-4.6 -o test test.cpp
invalid conversion from void* (*)(arg_struct*) to void * (*)(void*)
extern "C" void*
InThread_fnc( void* from_pthread_create )
{
    arg_struct const* p = static_cast< arg_struct const* >( from_pthread_create );
    (*p->func)( p->IntNumber );
    return nullptr;
}