linux下C语言多线程编程实例
多线程编程:
引用#include<pthread.h> #引入开启线程的头文件
pthread_create用来创建一个线程,原型为:
extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,
void *(*__start_routine) (void *), void *__arg));第一个参数为指向线程标识符的指针;第二个参数用来设置线程属性;
第三个参数是线程运行函数的起始地址 最后一个参数是运行函数的参数。
#include<stdio.h> #include <unistd.h> void * first(void *arg) { int i; for(i=1;i<=30;i++) { printf ("Pthread one: %d",i); sleep(1); } }
创建一个函数成功后 如果要使用必须要声明该函数:这时候就可以使用.h文件来声明函数:
创建一个自定义头文件 用来声明自己写的函数:
#ifndef__FIRST_H__ #define__FIRST_H__ void * first(void *arg); #endif
创建一个主函数main.c
#include<stdio.h> #include"first.h" #这里的""代表的是去找当前目录中的头文件 #include <pthread.h> #引用创建线程的头文件 int main(){ pthread_t thread; pthread_create(&thread,NULL,first,NULL); return 0; }
函数写完以后 进行编译:
自定义一个编译文件(makefile)
BJECT = main.o first.o TARGET = test ${TARGET}:${OBJECT} gcc -o ${TARGET} ${OBJECT} clean: rm -f ${TARGET} ${OBJECT}
这时候执行 输入:make
main.o: In function `main':
main.c:(.text+0x1f): undefined reference to `pthread_create'
会出现报错:
问题的原因:pthread不是linux下的默认的库,也就是在链接的时候,无法找到phread库中函数的入口地址,链接就会失败 报错
解决:在gcc编译的时候,附加要加 -lpthread参数即可解决。
修改后的 makefile文件
OBJECT = main.o first.o TARGET = test ${TARGET}:${OBJECT} gcc -o ${TARGET} -lpthread ${OBJECT} clean: rm -f ${TARGET} ${OBJECT}
编译成功就会出现:gcc -o test -lpthread main.o first.o
运行test文件时;发现线程中的函数未输出 就结束主线程了:
为什么会这样呢?
因为我们开的是一个线程 那么这时候就会重新创建一线程进行运行:
那么我们要看到线程中的函数输入结果呢
这时候就要用到我们前面所讲的的pthread_join 函数 等待这个线程执行完毕:
那么我们就需要修改这个main.c文件里面的内容啦:
#include<stdio.h> #include"first.h" #include <pthread.h> int main() { pthread_t thread; pthread_create(&thread,NULL,first,NULL); pthread_join(thread,NULL)#等待线程执行完毕 return 0; }
修改完成以后 那么就需要重新编译 :
1.先清空原有的编译:make clean
2.重新生成编译文件:make
这时候我们就看见执行文件的时候 并不是立马就结束主线程的
而是在等待子线程执行完以后才结束主线程:
子线程结束完毕以后:如下图:
Linux多线程编程就Over 啦
多线程完美结束: