zoukankan      html  css  js  c++  java
  • 线程

    1、线程的概念

    线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。

    2、为什么要创建多线程
    在进行多任务时并其中有耗时的任务,例如在进行a,b,c三个任务时,a耗时等待时,b,c任务就将等a完成后才进行。多线程的原理就是在a等待操作时并发的执行b,c操作,这样就节约程序的运行时间。(并发是指一个很短的时间间隔内,执行了多个任务。)
    详解看
    3、线程的创建
    #inlcude <pthread.h>                                          //线程的头文件
    int pthread_equal(pthread_t tid1, pthread_t tid2); // 判断两线程是否是同一个
    可以看到pthread_equal()函数接受两个线程参数,若他俩是同一个线程,就返回非0值,反之返回0

    另一方面,我们有时候会出现需要知道这个线程的ID是多少的情况,因此,还需要下面这样一个函数
    #include <pthread.h>
    pthread_t pthread_self(void); // 返回自己的线程ID

    通常当一个程序建立并成为一个进程的时候,它将以默认线程开始.所以,我们可以说每个进程至少有一个控制线程,一个进程可以使用下面的函数创建额外的线程:

    #include <pthread.h>
    int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void), void *restrict arg);

    参数解释:

    • 第一个参数是"pthread_t"类型的地址(address):一旦此函数调用成功,这个参数将会返回新创建的线程ID.
    • 第二个参数是线程属性,这些属性优先级将高于默认的线程属性.
    • 第三个参数是函数指针(a function pointer):每个线程从一个函数开始,并将此函数地址作为"第三个参数"传递到这里,以便内核(kernel)知道从哪个函数启动线程.
    • 作为函数(第三个参数)有可能需要传递一些参数进去,所以第四个参数便是以void类型指针的形式传递这些参数. *为什么选择void类型呢? *因为一个函数或许会接受不止一个参数,那么这个指针便可以是一个指向可能包含这些参数的结构的指针.
    例子:pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
    #include <stdio.h>
    #include <string.h>
    #include <pthread.h> // for thread
    #include <stdlib.h> 
    #include <unistd.h>
    
    pthread_t tid[2];  // 创建两个线程
    
    void *doSomeThing(void *arg)
    {
        unsigned long i = 0;
        pthread_t id = pthread_self();
    
        if(pthread_equal(id, tid[0]))
        {
            printf("
     First thread processing
    "); // 第一个线程正在执行
        }
        else
        {
            printf("
     Second thread processing
    ");
        }
        
        for(i=0; i<(0xFFFFFFFF); i++);
    
        return NULL;
    }
    
    int main(void)
    {
        int i = 0;
        int err;
    
        while(i < 2)
        {
            err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
            if(err != 0) printf("
     can't create thread:[%s]", strerror(err));
            else printf("
     Thread created successfully
    ");
      
            i++;
        }
        sleep(5);
        return 0;
    }

    编译时加入 -lpthread






  • 相关阅读:
    网络七层协议
    discuz 使用ajax post方式传递数据,body中带有双引号会报非法字符
    处理Highcharts数据过多导致的tooltip提示框数据显示不全问题
    Python和Js打印心形
    合并区间问题
    一个继承的小问题
    kotlin学习(10)反射
    kotlin学习(9)注解
    kotlin学习(8)泛型
    kotlin学习(7)高阶函数
  • 原文地址:https://www.cnblogs.com/wxc2/p/13295157.html
Copyright © 2011-2022 走看看