Linux多线程编程(创建线程)
- 创建线程
创建线程的函数是pthread_create,具体定义如下:
#include <pthread.h> int pthread_create(pthread_t *thread, // 新创建的线程ID const pthread_attr_t *attr, // 线程属性 void *(*start_routine) (void *), // 新创建的线程从start_routine开始执行 void *arg); // 执行函数的参数
创建线程函数使用示例:
1 #include <stdio.h> 2 #include <pthread.h> 3 #include <unistd.h> 4 5 void thread() 6 { 7 int i = 0; 8 9 for(i=0;i<3;i++) 10 { 11 printf("This is the new pthread (%d).\n", i); 12 sleep(1); 13 } 14 } 15 16 int main(int argc, char *argv[]) 17 { 18 pthread_t id; 19 int ret = 0; 20 21 ret=pthread_create(&id, NULL, (void *) thread, NULL); 22 if(ret!=0) 23 { 24 printf ("Create pthread error!\n"); 25 return 0; 26 } 27 28 printf("This is the main thread.\n"); 29 30 31 return 0; 32 }
使用如下命令编译:
gcc -o newthread newthread.c
发现编译不通过,报错如下:
[yuanping@Linux C]$ gcc -o newthread -g newthread.c /tmp/ccKagF7L.o: In function `main': newthread.c:(.text+0x7c): undefined reference to `pthread_create' newthread.c:(.text+0xe5): undefined reference to `pthread_join' collect2: ld returned 1 exit status [yuanping@Linux C]$
报这个错误的原因是:pthread库不是linux默认的库,所以在编译时候需要指明libpthread.a库。
解决方法:在编译时,加上-lpthread参数。
使用如下命令编译成功:
gcc -lpthread -o newthread -g newthread.c
执行结果:
[yuanping@Linux C]$ newthread
This is the main thread.
[yuanping@Linux C]$
上述结果并非预期的结果,预期的结果应该新创建的线程也打印 This is the new thread.
出现此问题的原因是主线程没有等待子线程正常退出,主线程运行结束退出时,所有的子线程都退出了。下面介绍通过pthread_join函数等待子线程运行结束。
- 等待线程退出
#include <pthread.h> int pthread_join(pthread_t thread, // 等待退出的线程ID void **retval); // 获取线程退出时的返回值
对前面的程序进行改进,添加如下代码:
pthread_join(id, NULL);
完整的程序代码如下:
1 /* example.c*/ 2 #include <stdio.h> 3 #include <pthread.h> 4 #include <unistd.h> 5 6 void thread() 7 { 8 int i = 0; 9 10 for(i=0;i<3;i++) 11 { 12 printf("This is the new pthread (%d).\n", i); 13 sleep(1); 14 } 15 } 16 17 int main(int argc, char *argv[]) 18 { 19 pthread_t id; 20 int ret = 0; 21 22 ret=pthread_create(&id, NULL, (void *) thread, NULL); 23 if(ret!=0) 24 { 25 printf ("Create pthread error!\n"); 26 return 0; 27 } 28 29 printf("This is the main thread.\n"); 30 31 pthread_join(id, NULL); 32 33 return 0; 34 }
编译运行结果如下:
[yuanping@Linux C]$ gcc -lpthread -o newthread -g newthread.c [yuanping@Linux C]$ newthread This is the main thread. [yuanping@Linux C]$ gcc -lpthread -o newthread -g newthread.c [yuanping@Linux C]$ newthread This is the main thread. This is the new pthread (0). This is the new pthread (1). This is the new pthread (2). [yuanping@Linux C]$
运行结果与预期的结果一致。