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]$ 

运行结果与预期的结果一致。

 

posted @ 2013-01-06 23:37  Yuan Ping  阅读(916)  评论(1编辑  收藏  举报