Chinaunix首页 | 论坛 | 博客
  • 博客访问: 495967
  • 博文数量: 63
  • 博客积分: 1187
  • 博客等级: 少尉
  • 技术积分: 706
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-05 16:53
个人简介

Must Be

文章分类

全部博文(63)

文章存档

2019年(1)

2017年(4)

2016年(6)

2015年(2)

2014年(1)

2013年(3)

2012年(10)

2011年(36)

我的朋友

分类: C/C++

2011-03-09 14:57:01

  1. #include<pthread.h>
  2. int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,
  3.                      void *(*start_rtn)(void),void *restrict arg);
    Returns 0 if OK, error number on failure,第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,第四个参数是运行函数的参数。

    当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法.pthread_create的用法:由于pthread库不是Linux系统默认的库,所以在使用pthread_create创建线程时,需要在编译中请加-lpthread参数,eg:gcc -o test -lpthrea test.c

例1:
  1. #include "pthread.h"
  2. #include "stdio.h"
  3. void* thread_test(void* ptr)
  4. {
  5.   while(1)
  6.     printf("i am pthread\n");
  7. }
  8. int main()
  9. {
  10.   pthread_t pid;
  11.   pthread_create(&pid, NULL, test_thread, NULL);
  12.   while(1)
  13.     printf("i am main pthread\n");
  14.   return 0;
  15. }

例2:
  1. #include
  2. #include
  3. pthread_t id;
  4. int ret;
  5. void thread_1()
  6. {
  7.   while(1)
  8.   {
  9.     printf(“I am thread\n”);
  10.     sleep(1);
  11.   }
  12. }
  13. main()
  14. {
  15.   ret = pthread_create(&id,NULL,(void*)thread_1,NULL);
  16.   if(ret != 0)
  17.     printf("Create pthread error!\n");
  18.   while(1)
  19.   {
  20.     printf(“I am main thread\n”);
  21.     sleep(2);
  22.   }
  23. }

例3:

  1. #include
  2. #include
  3. #include
  4. #include
  5. void *thread_function(void *arg);
  6. char message[] = "Hello World";
  7. int main()
  8. {
  9.   int res;
  10.   pthread_t a_thread;
  11.   void *thread_result;
  12.   res = pthread_create(&a_thread, NULL, thread_function, (void *)message);
  13.   if (res != 0)
  14.   {
  15.     perror("Thread creation failed");
  16.     exit(EXIT_FAILURE);
  17.   }
  18.   printf("Waiting for thread to finish...\n");
  19.   res = pthread_join(a_thread, &thread_result); //pthread_join 阻塞执行的线程直到某线程结束

  20.   if (res != 0)
  21.   {
  22.     perror("Thread join failed");
  23.     exit(EXIT_FAILURE);
  24.   }
  25.   printf("Thread joined, it returned %s\n", (char *)thread_result);
  26.   printf("Message is now %s\n", message);
  27.   exit(EXIT_SUCCESS);
  28. }
  29. void *thread_function(void *arg)
  30. {
  31.   printf("thread_function is running. Argument was %s\n", (char *)arg);
  32.   sleep(3);
  33.   strcpy(message, "Bye!");
  34.   pthread_exit("Thank you for the CPU time");
  35. }
  1. [root@plinux tmp]# cc -D_REENTRANT -I/usr/include/nptl thread2.c -o thread2 -L/usr/lib/nptl -lpthread
  2. [root@plinux tmp]# ./thread2
  3. thread_function is running. Argument was Hello World
  4. Waiting for thread to finish...
  5. Thread joined, it returned Thank you for the CPU time
  6. Message is now

    pthread_join的函数原型为int pthread_join(pthread_t pid, void **thread_return),pthread_exit的函数原型为void pthread_exit(void *retval),pthread_join()的调用者将挂起并等待th线程终止,retval是调用pthread_exit()的线程(线程ID为pid)的返回值,如果thread_return不为NULL,则*thread_return=retval。

    需要注意的是一个线程仅允许唯一的另一个线程使用 pthread_join()等待本线程的终止,并且被等待的线程应该处于可join状态,即非DETACHED状态。
阅读(1115) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~