线程相关操作说明

  一 pthread_t

  pthread_t在头文件/usr/include/bits/pthreadtypes.h中定义:

  typedef unsigned long int pthread_t;

  它是一个线程的标识符。

  二 pthread_create

  函数pthread_create用来创建一个线程,它的原型为:

  extern int pthread_create __P ((pthread_t *__thread, __const pthread_attr_t *__attr,

  void *(*__start_routine) (void *), void *__arg));

  第一个参数为指向线程标识符的指针,第二个参数用来设置线程属性,第三个参数是线程运行函数的起始地址,最后一个参数是运行函数的参数。这里,我们的函数thread不需要参数,所以最后一个参数设为空指针。第二个参数我们也设为空指针,这样将生成默认属性的线程。对线程属性的设定和修改我们将在下一节阐述。当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL.前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法。创建线程成功后,新创建的线程则运行参数三和参数四确定的函数,原来的线程则继续运行下一行代码。

  三 pthread_join pthread_exit

  函数pthread_join用来等待一个线程的结束。函数原型为:

  extern int pthread_join __P ((pthread_t __th, void **__thread_return));

  第一个参数为被等待的线程标识符,第二个参数为一个用户定义的指针,它可以用来存储被等待线程的返回值。这个函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。一个线程的结束有两种途径,一种是象我们上面的例子一样,函数结束了,调用它的线程也就结束了;另一种方式是通过函数pthread_exit来实现。它的函数原型为:

  extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__));

  唯一的参数是函数的返回代码,只要pthread_join中的第二个参数thread_return不是NULL,这个值将被传递给 thread_return.最后要说明的是,一个线程不能被多个线程等待,否则第一个接收到信号的线程成功返回,其余调用pthread_join的线程则返回错误代码ESRCH.

  在这一节里,我们编写了一个最简单的线程,并掌握了最常用的三个函数pthread_create,pthread_join和pthread_exit.下面,我们来了解线程的一些常用属性以及如何设置这些属性。

  互斥锁相关

  互斥锁用来保证一段时间内只有一个线程在执行一段代码。

  一 pthread_mutex_init

  函数pthread_mutex_init用来生成一个互斥锁。NULL参数表明使用默认属性。如果需要声明特定属性的互斥锁,须调用函数 pthread_mutexattr_init.函数pthread_mutexattr_setpshared和函数 pthread_mutexattr_settype用来设置互斥锁属性。前一个函数设置属性pshared,它有两个取值, PTHREAD_PROCESS_PRIVATE和PTHREAD_PROCESS_SHARED.前者用来不同进程中的线程同步,后者用于同步本进程的不同线程。在上面的例子中,我们使用的是默认属性PTHREAD_PROCESS_ PRIVATE.后者用来设置互斥锁类型,可选的类型有PTHREAD_MUTEX_NORMAL、PTHREAD_MUTEX_ERRORCHECK、 PTHREAD_MUTEX_RECURSIVE和PTHREAD _MUTEX_DEFAULT.它们分别定义了不同的上所、解锁机制,一般情况下,选用最后一个默认属性。

  二 pthread_mutex_lock pthread_mutex_unlock pthread_delay_np

  pthread_mutex_lock声明开始用互斥锁上锁,此后的代码直至调用pthread_mutex_unlock为止,均被上锁,即同一时间只能被一个线程调用执行。当一个线程执行到pthread_mutex_lock处时,如果该锁此时被另一个线程使用,那此线程被阻塞,即程序将等待到另一个线程释放此互斥锁。

  下面先来一个实例。我们通过创建两个线程来实现对一个数的递加。

  view source

  print?

  01 #include

  02 #include

  03 #include

  04 #include

  05 #define MAX 10

  06 pthread_t thread[2];

  07 pthread_mutex_t mut;

  08 int number=0, i;

  09 void *thread1()

  10 {

  11 printf ("thread1 : I'm thread 1\n");

  12 for (i = 0; i < MAX; i++)

  13 {

  14 printf("thread1 : number = %d\n",number);

  15 pthread_mutex_lock(&mut);

  16 number++;

  17 pthread_mutex_unlock(&mut);

  18 sleep(2);

  19 }

  20 printf("thread1 :主函数在等我完成任务吗?\n");

  21 pthread_exit(NULL);

  22 }

  23 void *thread2()

  24 {

  25 printf("thread2 : I'm thread 2\n");

  26 for (i = 0; i < MAX; i++)

  27 {

  28 printf("thread2 : number = %d\n",number);[nextpage]

  29 pthread_mutex_lock(&mut);

  30 number++;

  31 pthread_mutex_unlock(&mut);

  32 sleep(3);

  33 }

  34 printf("thread2 :主函数在等我完成任务吗?\n");

  35 pthread_exit(NULL);

  36 }

  37 void thread_create(void)

  38 {

  39 int temp;

  40 memset(&thread, 0, sizeof(thread)); //comment1

  41 /*创建线程*/

  42 if((temp = pthread_create(&thread[0], NULL, thread1, NULL)) != 0) //comment2

  43 printf("线程1创建失败!\n");

  44 else

  45 printf("线程1被创建\n");

  46 if((temp = pthread_create(&thread[1], NULL, thread2, NULL)) != 0) //comment3

  47 printf("线程2创建失败");

  48 else

  49 printf("线程2被创建\n");

  50 }

  51 void thread_wait(void)

  52 {

  53 /*等待线程结束*/

  54 if(thread[0] !=0) { //comment4

  55 pthread_join(thread[0],NULL);

  56 printf("线程1已经结束\n");

  57 }

  58 if(thread[1] !=0) { //comment5

  59 pthread_join(thread[1],NULL);

  60 printf("线程2已经结束\n");

  61 }

  62 }

  63 int main()

  64 {

  65 /*用默认属性初始化互斥锁*/

  66 pthread_mutex_init(&mut,NULL);

  67 printf("我是主函数哦,我正在创建线程,呵呵\n");

  68 thread_create();

  69 printf("我是主函数哦,我正在等待线程完成任务阿,呵呵\n");

  70 thread_wait();

  71 return 0;

  72 }

  下面我们先来编译、执行一下

  引文:

  falcon@falcon:~/program/c/code/ftp$ gcc -lpthread -o thread_example thread_example.c

  falcon@falcon:~/program/c/code/ftp$ ./thread_example

  我是主函数哦,我正在创建线程,呵呵

  线程1被创建

  线程2被创建

  我是主函数哦,我正在等待线程完成任务阿,呵呵

  thread1 : I'm thread 1

  thread1 : number = 0

  thread2 : I'm thread 2

  thread2 : number = 1

  thread1 : number = 2

  thread2 : number = 3

  thread1 : number = 4

  thread2 : number = 5

  thread1 : number = 6

  thread1 : number = 7

  thread2 : number = 8

  thread1 : number = 9

  thread2 : number = 10

  thread1 :主函数在等我完成任务吗?

  线程1已经结束

  thread2 :主函数在等我完成任务吗?

  线程2已经结束

原文出自【比特网】,转载请保留原文链接:http://soft.chinabyte.com/database/93/12333593.shtml

C语言多线程pthread库相关函数说明的更多相关文章

  1. 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

    Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

  2. VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程 转载

    VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程     转载 #include <stdio.h>#include &l ...

  3. C语言使用pthread多线程编程(windows系统)二

    我们进行多线程编程,可以有多种选择,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK实现了的线程库,如果你想让你的程序有更多的移植性你最好是选择POSIX中的Pthread函数库,我 ...

  4. linux下C/C++,多线程pthread《转载》

    原文网址:http://www.cnblogs.com/xianghang123/archive/2011/08/11/2134927.html ·线程创建   函数原型:int pthread_cr ...

  5. C 语言多线程与锁机制

    C 语言多线程与锁机制 多线程 #include <pthread.h> void *TrainModelThread(void *id) { ... pthread_exit(NULL) ...

  6. linux下C语言多线程编程实例

    用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...

  7. Leetcode多线程题库练习(新功能尝鲜)& 个人感悟

    大家好, 我是方子龙.很久没有自己写文章了. 一面是因为工作上的需求开发任务比较重,下班回家基本上就躺床玩几把王者,度过闲暇时光. 二面是一有点时间就自己主动地去看书和学习,知道自己还缺少很多知识,由 ...

  8. C语言常用的库文件(头文件、函数库)

    C语言常用的库文件(头文件.函数库) C系统提供了丰富的系统文件,称为库文件.C的库文件分为两类,一类是扩展名为".h"的文件,称为头文件,在前面的包含命令中我们已多次使用过.在& ...

  9. 13-C语言字符串函数库

    目录: 一.C语言字符串函数库 二.用命令行输入参数 回到顶部 一.C语言字符串函数库 1 #include <string.h> 2 字符串复制 strcpy(参数1,参数2); 参数1 ...

随机推荐

  1. jmeter -xml日志格式中网络时间与服务器时间的区分

    在 LR 中是有一个“网页细分图”的,通过这个图,你可以比较容易的区分哪些请求的响应时间最长,如果响应时间过程,是消耗在server处理的时候,还是消耗在网络传输过程中——也就是所谓的 Server ...

  2. FindBugs详解

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  3. navicat中文破解版,navicat破解版,navicat for mysql10.0.11简体中文破解版

    https://blog.csdn.net/weixin_40426638/article/details/78933585 下载链接如下(里面有破解码) https://pan.baidu.com/ ...

  4. 浅谈JS严格模式

    浅谈JS严格模式 简介 何为严格模式?严格模式(strict mode)即在严格的条件下运行,在严格模式下,很多正常情况下不会报错的问题语句,将会报错并阻止运行. 但是,严格模式可以显著提高代码的健壮 ...

  5. HCNP学习笔记之史上最全华为路由器交换机配置命令大合集

    先来一张思科和华为命令的对照表: 史上最全华为路由器交换机配置命令大合集,熟练掌握下面的华为路由器交换机配置知识点,你只需花几分钟的时间就能明白华为路由器交换机配置.交换机的配置命令等等. 华为路由器 ...

  6. bzoj1609 / P2896 [USACO08FEB]一起吃饭Eating Together(最长不降子序列)

    P2896 [USACO08FEB]一起吃饭Eating Together 显然的最长不升/降子序列,求出最长值,则答案为$n-$最长值(改掉剩下的). 复杂度$O(nlogn)$ (然鹅有神仙写了$ ...

  7. SQL Server 2008 添加约束

    ALTER TABLE Student --主键约束ADD CONSTRAINT PK_StuNo PRIMARY KEY (StudentNo) ALTER TABLE Student --唯一约束 ...

  8. asp.net自定义控件之加载层

    知识点:JQuery.Ajax.自定义控件 该文旨在给大家开发自定义控件(结合js)一个思路,一个简单的示例,可能在实际项目中并不会这样做. 先来看看效果: 1.在静态页面里开发好想要的效果 jQue ...

  9. Python学习札记(三十七) 面向对象编程 Object Oriented Program 8 @property

    参考:@property NOTE 1.在绑定参数时,为了避免对属性不符合逻辑的操作,需要对传入的参数进行审核. #!/usr/bin/env python3 class MyClass(object ...

  10. codeforces 97 div2 C.Replacement 水题

    C. Replacement time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...