当线程函数作为参数传递时,使用pthread_create()
创建线程时,下面的代码存在问题,该文件位于单独的文件中。它在同一个文件中工作正常。
我有Main.c
,ThreadFunction.h
,ThreadFunction.c
和makefile
。我猜这个问题出在makefile
,但我无法弄清楚。
我的问题:
是不是因为ThreadFunction.o
目标文件不是用-pthread
制作的?如果这就是原因,你怎么做?或者是因为别的什么?
以下是创建我的问题的代码:
MAIN.C
#include <stdio.h>
#include <pthread.h>
#include "ThreadFunction.h"
int main(int argc, char * argv[])
{
pthread_t tid;
int err;
void *res;
err = pthread_create(&tid, NULL, &ThreadFunction, "Argument from main");
err = pthread_join(tid, &res);
return 0;
}
ThreadFunction.h
static void *ThreadFunction(void *arg);
ThreadFunction.c
#include "ThreadFunction.h"
#include <stdio.h>
#include <pthread.h>
static void *ThreadFunction(void *arg)
{
pthread_t id = pthread_self();
printf("From thread: %s\n", (char *)arg);
printf("Thread ID: %ld\n", id);
}
生成文件
LINK_TARGET = test.exe
OBJS = Main.o ThreadFunction.o
REBUILDABLES = $(OBJS) $(LINK_TARGET)
LIBS = -pthread
clean:
rm -f $(REBUILDABLES)
echo Clean done
all: $(LINK_TARGET)
echo All done
$(LINK_TARGET) : $(OBJS)
gcc -g -o $@ $^ $(LIBS)
$.o : $.cpp
gcc -g -o $@ -c $<
Main.o : ThreadFunction.h
ThreadFunction.o : ThreadFunction.h
答案 0 :(得分:2)
静态函数是模块本地的,对其他编译单元不可见。从其定义和声明中删除static
。