在C ++中的pthread_create错误(类中的pthread)

我有这个C ++代码,我尝试创build一个pthread,并得到4个错误:

任何人都可以请帮忙?

提前致谢。

#include <pthread.h> #include <stdlib.h> #include <stdio.h> #include <iostream> static void* func(void*); class Test { public: pthread_t *threadId; pthread_create(threadId, NULL, func, NULL); }; static void* func(void *arg) { printf("Thread function called\n"); } int main() { Test(); } 

编译:

  # g++ simplepThread.cc -lpthread simplepThread.cc:11: error: 'threadId' is not a type simplepThread.cc:11: error: expected identifier before '__null' simplepThread.cc:11: error: expected ',' or '...' before '__null' simplepThread.cc:11: error: ISO C++ forbids declaration of 'pthread_create' with no type 

如果我使用线程函数作为“C”连接:

 extern "C" void* func(void *arg) { printf("Thread function called\n"); } 

面临的错误是:

 simplepThread.cc:7: error: previous declaration of 'void* func(void*)' with 'C++' linkage simplepThread.cc:15: error: conflicts with new declaration with 'C' linkage 

你不能在类声明中调用函数。 在类声明中,只能声明(也可能定义)其成员。 和

 pthread_create(threadId, NULL, func, NULL); 

不是有效的成员函数定义。
全班测试似乎是多余的。

 static void* func(void *arg) { printf("Thread function called\n"); } int main() { pthread_t threadId; pthread_create(&threadId, NULL, func, NULL); } 

应该工作正常。
我还修复了另一个问题 – 你试图将一个未初始化的指针( threadId )传递给一个需要一个变量地址的函数。
UPDATE
关于链接 – 你有一个默认的原型(C ++链接)

 void* func(void *arg); 

和C连接的定义

 extern "C" { void* func(void *arg) { .... } } 

所以他们冲突。 改变原型

 extern "C" { void* func(void *arg); } 

这将是确定的

你的代码有很多问题。 首先,你需要为Test类声明一个构造函数,并且给出了你如何使用代码,我将pthread_create()调用放在构造函数中。 其次,虽然pthread_create()以pthread_t *参数作为第一个参数,这意味着该参数被用作输出参数,并且指针应该指向实际的内存/变量,其中新创建的线程的线程ID将是放置。

 #include <pthread.h> #include <stdlib.h> #include <stdio.h> #include <iostream> static void* func(void*); class Test { public: pthread_t threadId; Test() { pthread_create(&threadId, NULL, func, NULL); } }; static void* func(void *arg) { printf("Thread function called\n"); } int main() { Test(); } 

一般来说,当你在做多线程代码的时候,你也要确保线程在完成时被销毁,或者跟踪自己何时死亡。 例如,如果您创建一个将用于在后台异步处理工作的“worker”线程,那么您通常需要为主线程设置一个受互斥锁保护的队列,以将工作传递给工作线程。 当程序想要退出时,通常还会需要一些信号灯或其他“安全的”信号系统,以使工作线程安全地死亡,并带有一个后台信号机制,以便主线程知道工作人员何时死亡,现在是安全的清理共享的数据结构。 (即把一块工作放在工作队列中,简单地说“死”,让工人在退出之前回复“死亡”)

实现正确的多线程代码是不平凡的,您不得不担心各种各样的问题,例如死锁和竞态条件,这些问题根本不会出现在单线程代码中。 我强烈建议您阅读,并确保您完全理解这些和其他主题。