线程相关操作说明

  一 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. Qml应用程序的性能考虑与建议

    本文翻译自Qt官网文档: http://doc.qt.io/qt-5/qtquick-performance.html QtQml应用程序的性能考虑与建议 1.时间考虑 作为一名程序开发者,应该努力使 ...

  2. 【运维技术】Jenkins配置使用教程

    Jenkins配置使用教程 单机jenkins启动 软件安装和启动,必须含有java环境 # 安装jdk,参考其他教程,创建文件目录 mkdir -p /app/jenkins cd /app/jen ...

  3. Vue学习笔记之Vue的模板字符串

    0x00 模板字符串 传统的JavaScript语言,输出模板通常是这样的写的. $('#result').append( 'There are <b>' + basket.count + ...

  4. P3811 【模板】乘法逆元

    P3811 [模板]乘法逆元 线性递推逆元模板 #include<iostream> #include<cstdio> #include<cstring> #def ...

  5. bzoj1628 [Usaco2007 Demo]City skyline(单调栈)

    Description Input 第一行给出N,W 第二行到第N+1行:每行给出二个整数x,y,输入的x严格递增,并且第一个x总是1 Output 输出一个整数,表示城市中最少包含的建筑物数量 Sa ...

  6. ubuntu18.04下搭建深度学习环境anaconda2+ cuda9.0+cudnn7.0.5+tensorflow1.7【原创】【学习笔记】

    PC:ubuntu18.04.i5.七彩虹GTX1060显卡.固态硬盘.机械硬盘 作者:庄泽彬(欢迎转载,请注明作者) 说明:记录在ubuntu18.04环境下搭建深度学习的环境,之前安装了cuda9 ...

  7. linux查看tftp服务是否启动

    netstat -a |grep tftp 若输出以下信息说明tftp服务已启动: udp  0 0 *:tftp *:*

  8. hdu 6301 Distinct Values(贪心)题解

    题意:长为n的串,给你m个区间,这些区间内元素不重复,问这样的串字典序最小为? 思路:用set保存当前能插入的元素,这样就能直接插入最小元素了.对操作按l排序,因为排过的不用排,所以两个指针L,R是一 ...

  9. [参考]ASCII对照表 及 字符与二进制、十进制、16进制之间的转化(C/C++)

    第1节 ASCII码对照表 1.1 ASCII控制字符 1.2 ASCII可显示字符 第2节字符的进制转换 2.1 获取字符(8位)的上四位和下四位 2.2 获取字符(上表中的‘图形’)所对应的十六进 ...

  10. 【Nature 子刊】I型HLA基因中和癌症相关的体细胞突变--转载

    肿瘤的发生与免疫系统的功能密切相关.在免疫系统中,MHC(主要组织相容性复体,majorhistocompatibilitycomplex)是所有生物相容复合体抗原的一种统称.HLA(humanleu ...