我有这个C ++代码,我尝试创建一个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
答案 0 :(得分:2)
您无法在类声明中调用函数。在类声明中,您只能声明(并可能定义)其成员。和
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
)传递给一个需要变量地址的函数。
的更新强>
关于链接 - 你有一个默认的原型(C ++链接)
void* func(void *arg);
用C连接定义
extern "C"
{
void* func(void *arg)
{
....
}
}
所以他们发生冲突。将原型改为
extern "C"
{
void* func(void *arg);
}
没关系
答案 1 :(得分:2)
您的代码存在许多问题。首先,你需要为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();
}
通常,当您执行多线程代码时,您还需要确保在完成线程时销毁线程,或者跟踪它们何时自行消亡。例如,如果您创建一个“工作”线程,该线程将用于异步处理后台工作,那么您通常希望为主线程提供一个受互斥锁保护的队列,以便将工作传递给工作线程。您通常还需要一些信号量或其他“安全”信号系统,以便在程序想要退出时使工作线程安全地死亡,并使用反向信号机制,因此主线程知道工作人员何时死亡并且现在是安全的清理共享数据结构。 (即,在工作队列中放置一条简单的“死”工作,让工人在退出前回复“死亡”)
实现正确的多线程代码并非易事,您必须担心各种问题,例如死锁和竞争条件,这些问题根本不会出现在单线程代码中。我强烈建议您阅读并确保您完全理解这些和其他主题。