zoukankan      html  css  js  c++  java
  • C语言编程(多线程)

    C语言中多线程编程包括的文件:#include<pthread.h>(linux环境下)

    pthread_t //线程函数返回类型

    pthread_mutrex_t //互斥锁类型

    int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*func),void *arg);

    参数说明

    thread :指向thread_t类型变量的指针,用于保存线程的ID

    typedef unsigned long int thread_t;

    attr :指向pthread_attr_t类型变量的指针,或者为NULL

    func:指向新线程所运行函数的指针

    arg: 传递给func的参数

    成功创建线程则返回0,否则返回非零

    这个参数为线程属性,pthread_attr_t主要包括:scope属性,detach属性,堆栈地址,堆栈大小,优先级。参数设置为NULL则将采用默认的属性配置。

    http://blog.csdn.net/hudashi/article/details/7709413

    http://hi.baidu.com/7828058/blog/item/256e16decd1a385e94ee3784.html

    http://www.ibm.com/developerworks/cn/linux/thread/posix_threadapi/part1/ 
      Posix线程中的线程属性pthread_attr_t主要包括scope属性、detach属性、堆栈地址、堆栈大小、优先级。在pthread_create中,把第二个参数设置为NULL的话,将采用默认的属性配置。
    pthread_attr_t的主要属性的意义如下:
    __detachstate,表示新线程是否与进程中其他线程脱离同步, 如果设置为PTHREAD_CREATE_DETACHED 则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。
    __schedpolicy,表示新线程的调度策略,主要包括SCHED_OTHER(正常、非实时)、SCHED_RR(实时、轮转法)和SCHED_FIFO(实时、先入先出)三种,缺省为SCHED_OTHER,后两种调度策略仅对超级用户有效。运行时可以用过pthread_setschedparam()来改变。
    __schedparam,一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0。
    __inheritsched,有两种值可供选择:PTHREAD_EXPLICIT_SCHED和PTHREAD_INHERIT_SCHED,前者表示新线程使用显式指定调度策略和调度参数(即attr中的值),而后者表示继承调用者线程的值。缺省为PTHREAD_EXPLICIT_SCHED。
    __scope,表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。
      为了设置这些属性,POSIX定义了一系列属性设置函数,包括pthread_attr_init()、pthread_attr_destroy()和与各个属性相关的pthread_attr_getXXX/pthread_attr_setXXX函数。
    在设置线程属性 pthread_attr_t 之前,通常先调用pthread_attr_init来初始化,之后来调用相应的属性设置函数。
    主要的函数如下:
    1、pthread_attr_init
    功能:        对线程属性变量的初始化。
    头文件:     <pthread.h>
    函数原型:   int pthread_attr_init (pthread_attr_t* attr);
    函数传入值:attr:线程属性。
    函数返回值:成功: 0
                    失败: -1
    2、pthread_attr_setscope
    功能:        设置线程 __scope 属性。scope属性表示线程间竞争CPU的范围,也就是说线程优先级的有效范围。POSIX的标准中定义了两个值:PTHREAD_SCOPE_SYSTEM和PTHREAD_SCOPE_PROCESS,前者表示与系统中所有线程一起竞争CPU时间,后者表示仅与同进程中的线程竞争CPU。默认为PTHREAD_SCOPE_PROCESS。目前LinuxThreads仅实现了PTHREAD_SCOPE_SYSTEM一值。
    头文件:     <pthread.h>
    函数原型:   int pthread_attr_setscope (pthread_attr_t* attr, int scope);
    函数传入值:attr: 线程属性。
                          scope:PTHREAD_SCOPE_SYSTEM,表示与系统中所有线程一起竞争CPU时间,
                                     PTHREAD_SCOPE_PROCESS,表示仅与同进程中的线程竞争CPU
    函数返回值得:同1。
    3、pthread_attr_setdetachstate
    功能:        设置线程detachstate属性。该表示新线程是否与进程中其他线程脱离同步,如果设置为PTHREAD_CREATE_DETACHED则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到PTHREAD_CREATE_JOINABLE状态。
    头文件:      <phread.h>
    函数原型:    int pthread_attr_setdetachstate (pthread_attr_t* attr, int detachstate);
    函数传入值:attr:线程属性。
    detachstate:PTHREAD_CREATE_DETACHED,不能用pthread_join()来同步,且在退出时自行释放所占用的资源
                        PTHREAD_CREATE_JOINABLE,能用pthread_join()来同步
    函数返回值得:同1。
    4、pthread_attr_setschedparam
    功能:       设置线程schedparam属性,即调用的优先级。
    头文件:     <pthread.h>
    函数原型:   int pthread_attr_setschedparam (pthread_attr_t* attr, struct sched_param* param);
    函数传入值:attr:线程属性。
                     param:线程优先级。一个struct sched_param结构,目前仅有一个sched_priority整型变量表示线程的运行优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效,并可以在运行时通过pthread_setschedparam()函数来改变,缺省为0
    函数返回值:同1。
    5、pthread_attr_getschedparam
    功能:       得到线程优先级。
    头文件:    <pthread.h>
    函数原型:  int pthread_attr_getschedparam (pthread_attr_t* attr, struct sched_param* param);
    函数传入值:attr:线程属性;
                        param:线程优先级;
    函数返回值:同1。

    当线程的属性没有设置为PTHREAD_CREATE_DETACH时候,我们可以使用pthread_join等待进程结束,来释放资源。

    函数原型

    int pthread_join(pthread_t thread,void** retval)

    参数说明:

    thread:所等待的进程

    retval:z指向某存储线程返回值的变量

    返回值:0   成功返回

        errorcode 错误

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <pthread.h>
      4 #include <windows.h>
      5 
      6 int  piao = 100;
      7 
      8 pthread_mutex_t mut;
      9 
     10 void* tprocess1(void* args) 
     11 {
     12     int a = 0;      
     13     while (true) 
     14     {
     15                pthread_mutex_lock(&mut);
     16          if (piao>0) 
     17          {
     18             Sleep(1);
     19             piao--;
     20             printf("窗口1----------------还剩%d张票
    ", piao);
     21         }
     22         else 
     23         {
     24              a = 1;
     25         }
     26             pthread_mutex_unlock(&mut);
     27          if (a == 1) 
     28          {
     29             break;
     30         }
     31     }
     32     return NULL;
     33 }
     34 
     35 void* tprocess2(void* args) 
     36 {
     37     int a = 0;
     38     while (true) 
     39     {
     40        pthread_mutex_lock(&mut);
     41        if (piao>0) 
     42        {
     43          Sleep(1);
     44               piao--;
     45            printf("窗口2----------------还剩%d张票
    ", piao);
     46          }
     47         else
     48         {
     49          a = 1;
     50          }
     51            pthread_mutex_unlock(&mut);
     52       if (a == 1) 
     53       {
     54         break;
     55        }
     56     }
     57     return NULL;
     58 }
     59 void* tprocess3(void* args) 
     60 {
     61        int a = 0;
     62          while (true) 
     63         {
     64         pthread_mutex_lock(&mut);
     65         if (piao>0) 
     66         {
     67               Sleep(1);
     68               piao--;
     69               printf("窗口3----------------还剩%d张票
    ", piao);
     70         }
     71         else 
     72         {
     73             a = 1;
     74         }
     75         pthread_mutex_unlock(&mut);
     76        if (a == 1) 
     77         {
     78             break;
     79     }
     80       }
     81       return NULL;
     82 }
     83 void* tprocess4(void* args)
     84 {
     85     int a = 0;
     86      while (true) 
     87     {
     88           pthread_mutex_lock(&mut);
     89            if (piao>0) 
     90            {
     91               Sleep(1);
     92                    piao--;
     93          printf("窗口4----------------还剩%d张票
    ", piao);
     94         }
     95         else
     96         {
     97            a = 1;
     98         }
     99        pthread_mutex_unlock(&mut);
    100          if (a == 1)
    101          {
    102            break;
    103         }
    104     }
    105           return NULL;
    106 }
    107 
    108 int main() {
    109       pthread_mutex_init(&mut, NULL);
    110       pthread_t t1;
    111      pthread_t t2;
    112      pthread_t t3;
    113       pthread_t t4;
    114   pthread_create(&t4, NULL, tprocess4, NULL);
    115       pthread_create(&t1, NULL, tprocess1, NULL);
    116       pthread_create(&t2, NULL, tprocess2, NULL);
    117   pthread_create(&t3, NULL, tprocess3, NULL);
    118       Sleep(5000);
    119   return 0;
    120 }
    //线程一的线程函数一结束就自动释放资源,线程二就得等到pthread_join来释放系统资源。

    #include <stdlib.h> #include <stdio.h> #include <errno.h> #include <pthread.h> static void pthread_func_1 (void); static void pthread_func_2 (void); int main (int argc, char** argv) { pthread_t pt_1 = 0; pthread_t pt_2 = 0; pthread_attr_t atrr = {0}; int ret = 0; /*初始化属性线程属性*/ pthread_attr_init (&attr); pthread_attr_setscope (&attr, PTHREAD_SCOPE_SYSTEM); pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED); ret = pthread_create (&pt_1, &attr, pthread_func_1, NULL); if (ret != 0) { perror ("pthread_1_create"); } ret = pthread_create (&pt_2, NULL, pthread_func_2, NULL); if (ret != 0) { perror ("pthread_2_create"); } pthread_join (pt_2, NULL); return 0; } static void pthread_func_1 (void) { int i = 0; for (; i < 6; i++) { printf ("This is pthread_1. "); if (i == 2) { pthread_exit (0); } } return; } static void pthread_func_2 (void) { int i = 0; for (; i < 3; i ++) { printf ("This is pthread_2. "); } return; }
  • 相关阅读:
    吴军博士:物联网和人工智能将再造一个英特尔和微软 | 万物互联
    速来膜拜!20位活跃在Github上的国内技术大牛
    创建带Mipmap的osg::Image
    C#文件系统管理【转】
    C#文本文件(.txt)读写 [转]
    C#连接SQL Server数据库进行简单操作[转]
    shell脚本把一些请求量非常高的ip给拒绝掉
    linux获取精准进程PID之pgrep命令
    Kubernetes的Cron Job
    StatefulSet和Deployment的区别
  • 原文地址:https://www.cnblogs.com/hai5111/p/7718301.html
Copyright © 2011-2022 走看看