第一次使用pthread,遇到的问题还真不少,现在我一一记录一下:

1.关于编译时出现 对‘pthread_create’未定义的引用 之类的错误的解决:由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:
    gcc -o pthread -lpthread pthread.c

特别的,如果这样还没解决的话:

按照上面编译了一下,还是一样的提示.

后面man gcc
  才知道Usage: gcc [options] file...
  因此需要将库链接放在末尾。
  xs@vm:~/Desktop$ gcc -o pthread pthread.c -lpthread

2.关于pthread里的一些函数.

pthread_join函数:

函数pthread_join用来等待一个线程的结束。
   函数定义: int pthread_join(pthread_t thread, void **retval);
   描述 :
   pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。

参数 :
   thread: 线程标识符,即线程ID,标识唯一线程。
   retval: 用户定义的指针,用来存储被等待线程的返回值。
   返回值 : 0代表成功。 失败,返回的则是错误号。

看下面一段程序:

  1. #include <pthread.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. void *thread(void *str)
  5. {
  6. int i;
  7. for (i = 0; i < 10; ++i)
  8. {
  9. sleep(2);
  10. printf( "This in the thread : %d\n" , i );
  11. }
  12. return NULL;
  13. }
  14.  
  15. int main()
  16. {
  17. pthread_t pth;
  18. int i;
  19. int ret = pthread_create(&pth, NULL, thread, (void *)(i));
  20.  
  21. pthread_join(pth, NULL);
  22. for (i = 0; i < 10; ++i)
  23. {
  24. sleep(1);
  25. printf( "This in the main : %d\n" , i );
  26. }
  27.  
  28. return 0;
  29. }

如果我们注释掉"pthread_join(pth, NULL);"这一行:

运行结果如下:

也就是说:子线程还没有执行完毕,main函数已经退出,那么子线程也就退出了!

如果我们不注释掉那一行,那么运行结果如下:

这说明:pthread_join函数的调用者在等待子线程退出后才继续执行!

pthread_create函数:

声明:

int pthread_create(pthread_t *thread,

                    const pthread_attr_t *restrict_attr,

                    void*(*start_rtn)(void*),

                    void *restrict arg);

参数:

第一个参数*thread为指向线程标识符的指针。
   第二个参数*restrict_attr用来设置线程属性,上面也可以用NULL,表示使用默认的属性。
   第三个参数是线程运行函数的起始地址。
   最后一个参数是运行函数的参数,NULL表示无参数。
   另外,在编译时注意加上-lpthread参数,以调用链接库。因为pthread并非Linux系统的默认库,而是posix线程库,在Linux中将其作为一个库来使用,因此加上 -lpthread(或-pthread)以显示的链接该库。函数在执行错误时的错误信息将作为返回值返回,并不修改系统全局变量errno,当然也无法使用perror()打印错误信息。

pthread_t:pthread_t用于声明线程ID!

类型定义:
   typedef unsigned long int pthread_t;
   //come from /usr/include/bits/pthread.h
   sizeof (pthread_t) =4;

pthread_attr_init函数:

声明:int pthread_attr_init(pthread_attr_t*attr);

返回值:返回0,表示函数初始化对象成功。失败时返回一个错误代码。
   参数:指向一个线程属性的指针。

下面一个程序是书上的:

  1. /*小小的一个程序,折腾人个半死*/
  2. #include <pthread.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5.  
  6. int sum;
  7. void *runner (void *param);
  8.  
  9. int main(int argc, char *argv[])
  10. {
  11. pthread_t tid;/*线程标示符*/
  12. pthread_attr_t attr;
  13.  
  14. if (argc != 2)/*如果参数不为2个*/
  15. {
  16. fprintf (stderr, "usage:a.out<integer value>\n");/*报错*/
  17. return -1;
  18. }
  19. if (atoi(argv[1] ) < 0)
  20. {
  21. fprintf (stderr, "%d must be <= 0\n", atoi(argv[1]));
  22. return -1;
  23. }
  24. pthread_attr_init(&attr); /*初始化,得到默认的属性值*/
  25. pthread_create(&tid, &attr, runner, argv[1]);/*创建一个线程*/
  26. pthread_join(tid, NULL);/*等待子线程执行完毕*/
  27.  
  28. printf ("sum = %d\n", sum);
  29. return 0;
  30. }
  31.  
  32. void *runner(void *param)/*子线程将会执行这个函数*/
  33. {
  34. int i, upper = atoi(param);
  35. sum = 0;
  36. for (i = 1; i <= upper; i++)
  37. {
  38. sum += i;
  39. }
  40. pthread_exit(0);
  41. }

关于pthread里面一些函数的使用心得!的更多相关文章

  1. (转)使用AfxGetMainWnd函数的一个心得

    作者:朱金灿 来源:http://blog.csdn.net/clever101/ 使用AfxGetMainWnd函数获取MFC程序中的主框架类指针是一个常用作法.但是你会发现这一做法有时也会失灵.不 ...

  2. 关于c语言中qsort函数的一点心得

    今天写c时无意间用到了排序,便想着使用c语言标准库中提供的排序函数,即qsort函数(c++stl中提供了sort函数用于排序),首先是介绍qsort函数的一些基本用法(以下内容转自: http:// ...

  3. 关于boost::function与boost::bind函数的使用心得

    最近开始写一个线程池,期间想用一个通用的函数模板来使得各个线程执行不同的任务,找到了Boost库中的function函数. Boost::function是一个函数包装器,也即一个函数模板,可以用来代 ...

  4. pthread的pthread_join()函数理解实验

    一.使用方式 pthread_t tid;pthread_create(&tid, NULL, thread_run,NULL);pthread_join(tid,NULL);创建线程之后直接 ...

  5. Windows编程中回调函数的使用心得(MFC篇)

    回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定 ...

  6. 查询pthread库的函数

    首先需要先安装pthread看的手册文档,然后用如下命令查询: man -k pthread

  7. MySQL中的find_in_set()函数使用技巧心得与应用场景总结

    Author:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,CSDN官方首发原创文章 企业博客 CSDN.com 个人博 ...

  8. 线程模型、pthread 系列函数 和 简单多线程服务器端程序

    一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属于1:1模型. (一).N:1用户线程模型 “线程实现”建立在“进程控制”机制之上,由用 ...

  9. js函数式编程——蹦床函数

    概述 这是我在学习函数式编程的时候,关于递归,尾递归,相互递归和蹦床函数的一些心得,记下来供以后开发时参考,相信对其他人也有用. 参考资料:JavaScript玩转Clojure大法之 - Tramp ...

随机推荐

  1. Android数据存储(1)少量数据保存之SharedPreferences接口实例

    SharedPreferences数据保存主要是通过键值的方式存储在xml文件中 xml文件在data/此程序的包名/XX.xml 格式 <?xml version='1.0' encoding ...

  2. JAVA中的继承和覆盖

    java里面的继承是子类继承父类的一些方法和属性(除private属性和方法之外):对于父类的私有属性和方法子类是没有继承的.可是要想子类也能訪问到父类的私有属性,必须给私有属性以外界訪问的方法接口. ...

  3. windows下如何设置mysql环境变量

    方法一: windows下如何设置mysql环境变量 关键词: mysql, Setting Environment Variables, 环境变量设置 我的电脑->属性->高级-> ...

  4. [转] Nginx模块开发入门

    前言 Nginx是当前最流行的HTTP Server之一,根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中,Nginx的占有率为6.8%.与Apache相比,Nginx在高并 ...

  5. TCP的封包与拆包

    对于基于TCP开发的通讯程序,有个很重要的问题需要解决,就是封包和拆包. 一.为什么基于TCP的通讯程序需要进行封包和拆包. TCP是个"流"协议,所谓流,就是没有界限的一串数据. ...

  6. Day3 - Python基础3 函数、递归、内置函数

    Python之路,Day3 - Python基础3   本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8. ...

  7. 工厂模式[3] 抽象工厂 Abstract Factory

    简介 1.简单工厂,或静态工厂,产品接口 定义:专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类或实现同一接口 优点:客户端可以直接消费产品,而不必关心具体产品的实现(不关心对象的 ...

  8. jsonp Ajax跨域请求

    什么是JSONP? JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域 ...

  9. utils object doesn,t exists中毒后,就删除了.JS文件后台就出现了前面的英文。请问怎么解决

    明显是你删了js丢失了函数了...从备份里还原一份.js出来放进去,前台也不能删,如果遇到名字冲突,修改一下名字即可

  10. 配置中的address不能重复

    <jaxws:endpoint  implementor="com.service.imp.UserServiceImpl" address="/user" ...