用gcc编译一个名字为thread.cpp生成的目标文件thread.o(gcc thread.o -o thread)时,报错:thread.o(.eh_frame+0x63):undefined reference to '__gxx_personality_v0' collected2:error: ld returned 1 exit status
原因为gcc为c编译器,只可编译.c文件;
g++为C++编译器,兼容c,可用g++编译.cpp文件以及.c文件。
解决方案1:.cpp 改名为.c
解决方案2:对生成的目标文件thread.o执行操作(g++ thread.o -o thread)
注意:pthread_create函数的参数的使用
源代码如下:
#include <stdio.h>
#include <pthread.h>
void *thread_address(void *);
int main(int argc,char *argv[])
{
pthread_t thread;
pthread_create(&thread,NULL,thread_address,NULL);//创建线程,用法
pthread_join(thread,NULL);//主线程一直阻塞等待thread的返回
return 0;
}
void *thread_address(void *)
{
printf("create thread successfully !\n");
printf("thread num:%d\n",1);
pthread_exit(0);
}
运行结果如下:
注:
在Linux中,默认情况下,在一个线程被创建后,必须使用此函数对创建的线程进行资源回收,但是可以设置Threads attributes来设置当一个线程结束时,直接回收此线程所占用的系统资源。
在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone()。该系统copy了一个和原先进程完全一样的进程,并在这个进程中执行线程函数。不过这个copy过程和fork不一样。copy后的进程和原先的进程共享了所有的变量,运行环境。
代码中如果没有pthread_join主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入pthread_join后,主线程会一直等待知道等待的线程结束自己才结束,使创建的线程有机会执行。