一 Linux--多线程( 二 )


  • 与线程有关的函数构成了一个完整的系列,绝大多数的名字都是以“pthread_”打头的 。
  • 使用线程库需要映入头文件pthread.h,链接这些线程函数是 , 需要指明线程库名 , 所以编译时要加上选项-lpthread 。
  • 注意: Linux内核没有提供线程管理的库函数 , 这里的线程库是用户提供的线程管理功能
    错误检查:
    • 传统的一些函数是,成功返回0,失败返回-1,并且对全局变量errno赋值以指示错误 。
    • pthreads函数出错时不会设置全局变量errno(而大部分其他POSIX函数会这样做,不然这个全局变量就成为临界资源了) 。而是将错误代码通过返回值返回 。
    • pthreads同样也提供了线程内的errno变量,以支持其它使用errno的代码 。对于pthreads函数的错误,建议通过返回值判定 , 因为读取返回值要比读取线程内的errno变量的开销更小 。
    线程创建int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);功能:创建一个线程 。参数:    thread:线程标识符地址    attr:线程属性结构体地址,通常设置为NULL    start_routine:线程函数的入口地址    arg:传给线程函数的个数返回值:    成功:0    失败:非0在一个线程中调用pthread_create()创建新的线程之后,当前线程从pthread_create()返回继续向下运行,而新的线程所执行的代码由我们传给pthread_create的函数指针start_routine决定 。
    由于pthread_create的错误码不保存在errno当中,因此不能直接使用perror()打印错误信息,可以先用strerror()把错误码转成错误信息再打印 。
    代码示例:
     #include<stdio.h> #include<stdlib.h> #include<string.h> #include<pthread.h> //线程调度之后执行的任务 void *fun(void *arg) {    printf("新的线程执行任务 tid:%ld\n",pthread_self());    //退出当前函数体    return NULL; }int main(){    int ret = -1;    pthread_t tid = -1;    //创建一个线程    ret = pthread_create(&tid,NULL,fun,NULL);    if(0!=ret)    {      //根据错误号打印错误信息      printf("error information:%s\n",strerror(ret));      return 1;    }    printf("main thread.....tid:%lud\n",pthread_self());    return 0;}运行结果如下:
    一 Linux--多线程

    文章插图
    线程在创建过程中不会阻塞 , 主进程会立刻执行,那么存在一个问题 , 主进程如果执行完毕 , 那么所有线程都将被释放,就可能出现线程还未调度的问题 。(后面会解决)
    线程和进程有区别,父子进程执行的代码段是一样的,但是线程被创建之后执行的是线程处理函数 。
    再介绍一个函数:
    就像每个进程都有一个进程号一样,每个线程也有一个线程号 。进程号再整个系统中是唯一的,但是线程号不同,线程号只在它所属的进程环境中有效 。
    进程号用pid_t数据类型表示,是一个非负整数 。线程号则用pthread_t数据类型来表示,Linux使用无符号长整型数表示 。
    实例1: 创建一个线程,观察代码运行效果和函数用法
    pthread_t pthread_self(void);功能:获取线程号参数:无返回值:调用线程的线程ID#include <stdio.h>#include <pthread.h>#include <unistd.h>void* pthreadrun(void* arg){ char* name = (char*)arg; while (1){printf("%s is running...\n", name);sleep(1); }}int main(){ pthread_t pthread; // 创建新线程 pthread_create(&pthread, NULL, pthreadrun, (void*)"new thread"); while (1){printf("main thread is running...\n");sleep(1); } return 0;}运行结果如下:
    一 Linux--多线程

    文章插图
    实例2: 创建4个线程,然后打印出各自的pid和线程id
    #include <stdio.h>#include <pthread.h>#include <unistd.h>void* pthreadrun(void* arg){  long id = (long)arg;  while (1){    printf("threaad %ld is running, pid is %d, thread id is %p\n", id, getpid(), pthread_self());    sleep(1);  }}int main(){  pthread_t pthread[5];  int i = 0;  for (; i < 5; ++i)  {    // 创建新线程    pthread_create(pthread+i, NULL, pthreadrun, (void*)i);  }  while (1){    printf("main thread is running, pid is %d, thread id is %p\n", getpid(), pthread_self());    sleep(1);  }  return 0;}

    推荐阅读