Liunx多线程pthread初探

一、线程标识

  • 线程有ID, 但不是系统唯一, 而是进程环境中唯一有效.
  • 线程的句柄是pthread_t类型, 该类型不能作为整数处理, 而是一个结构.

下面介绍两个函数:

  • 头文件: <pthread.h>
  • 原型: int pthread_equal(pthread_t tid1, pthread_t tid2);
  • 返回值: 相等返回非0, 不相等返回0.
  • 说明: 比较两个线程ID是否相等.

 

  • 头文件: <pthread.h>
  • 原型: pthread_t pthread_self();
  • 返回值: 返回调用线程的线程ID.

二、线程创建

 在执行中创建一个线程, 可以为该线程分配它需要做的工作(线程执行函数), 该线程共享进程的资源. 创建线程的函数pthread_create()

  • 头文件: <pthread.h>
  • 原型: int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(start_rtn)(void), void *restrict arg);
  • 返回值: 成功则返回0, 否则返回错误编号.
  • 参数:
    • tidp: 指向新创建线程ID的变量, 作为函数的输出.
    • attr: 用于定制各种不同的线程属性, NULL为默认属性(见下).
    • start_rtn: 函数指针, 为线程开始执行的函数名.该函数可以返回一个void *类型的返回值,而这个返回值也可以是其他类型,并由 pthread_join()获取
    • arg: 函数的唯一无类型(void)指针参数, 如要传多个参数, 可以用结构封装.
    •  因为pthread的库不是linux系统的库,所以在进行编译的时候要加上     -lpthread
    • 也可以自己在编译器里设置好pthread的路径,然后就可以直接通过编译器编译了
      #include<iostream>
      #include<stdio.h>
      #include<pthread.h>
      #include<unistd.h>
      using namespace std;
      
      void *func1(void *ptr)
      {
          for(int i=0; i<5; i++)
          {
              printf("This is thread1!\n");
              sleep(1);
          }
      }
      
      void *func2(void *ptr)
      {
          for(int i=0; i<5; i++)
          {
              printf("This is thread2!\n");
              sleep(1);
          }
      }
      
      
      
      int main()
      {
          pthread_t id1,id2;
          int thread1 = pthread_create(&id1,NULL,func1,NULL);
          if(thread1)
          {
              printf("Create thread1 error!\n");
              return 1;
          }
          int thread2 = pthread_create(&id2,NULL,func2,NULL);
          if(thread2)
          {
              printf("Create thread2 error!\n");
              return 1;
          }
          pthread_join(id1,NULL);
          pthread_join(id2,NULL);
          return 0;
      }

    向线程传递参数

    #include<iostream>
    #include<stdio.h>
    #include<pthread.h>
    #include<unistd.h>
    using namespace std;
    
    void *func(void *ptr)
    {
        int *num = (int*)ptr;
        printf("a = %d\n",*num);
    }
    
    int main()
    {
        int a = 666;
        int *p = &a;
        pthread_t id;
        int thread = pthread_create(&id,NULL,func,p);
        if(thread)
        {
            printf("Create thread error!\n");
            return 1;
        }
        sleep(1);
        printf("Thread is created!\n");
        return 0;
    }

三、线程属性

 pthread_create()中的attr参数是一个结构指针,结构中的元素分别对应着新线程的运行属性,主要包括以下几项:

 __detachstate,表示新线程是否与进程中其他线程脱离同步,如果置位则新线程不能用pthread_join()来同步,且在退出时自行释放所占用的资源。缺省为PTHREAD_CREATE_JOINABLE状态。这个属性也可以在线程创建并运行以后用pthread_detach()来设置,而一旦设置为PTHREAD_CREATE_DETACH状态(不论是创建时设置还是运行时设置)则不能再恢复到  PTHREAD_CREATE_JOINABLE状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值