• 14 多线程编程


    这里所指的线程是POSIX线程(简称pthread)

    线程同步方式:POSIX信号量、互斥锁、条件变量

    根据运行环境和调度者身份,线程可分为内核线程和用户线程

    创建线程和结束线程

     1 #include <pthread.h>
     2 int pthread_create(pthread_t* thread, const pthread_attr_* attr, void* (*start_routine)(void*), void* arg);    //创建线程
     3 int pthread_exit(void* retval);    //退出线程
     4 
     5 //一个进程中的所有线程都可以调用pthread_join函数来回收其他线程,即等待其他线程结束
     6 int pthread_join(pthread_t thread, void** retval);    
     7 
     8 
     9 //有时候我们希望异常终止一个线程,即取消线程
    10 int pthread_cancel(pthread_t thread);
    11 
    12 //目标线程可以决定是否允许被取消以及如何取消,这分别由如下两个函数完成:
    13 int pthread_setcancelstate(int state, int* oldstate);
    14 int pthread_setcanceltype(int type, int* oldtype);

    线程属性

    pthread_attr_t 结构体定义了一套完整的线程属性

    #include <bits/pthreadtypes.h>
    #define __SIZEOF_PTHREAD_ATTR_T 36
    typedef union{
        char __size[__SIZEOF_PTHREAD_ATTR_T];
        long int __align;
    }pthread_attr_t;

    POSIX信号量

    互斥锁

    #include <pthread.h>
    int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* mutexattr);
    int pthread_mutex_destroy(pthread_mutex_t* mutex);
    int pthread_mutex_lock(pthread_mutex_t* mutex);
    int pthread_mutex_trylock(pthread_mutex_t* mutex);
    int pthread_mutex_unlock(pthread_mutex_t* mutex);

    条件变量

    线程间同步共享数据的值,条件变量提供了一种线程间的通知机制:当某个共享数据达到某个值的时候,唤醒等待这个共享数据的线程

    1 int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t* cond_attr);
    2 int pthread_cond_destroy(pthread_cond_t* cond);
    3 int pthread_cond_broadcast(pthread_cond_t* cond);
    4 int pthread_cond_signal(pthread_cond_t* cond);
    5 int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);

    多线程环境

    可重入函数:如果一个函数能被多个线程同时调用且不发生竞态条件,则我们称它是线程安全的,或说它是可重入函数。linux库函数只有一小部分是不可重入的。这些库函数之所以不可重入,主要是因为其内部使用了静态变量。不可重入库函数的可重入版本是在原函数名尾部加上 _r。

  • 相关阅读:
    2020.12.15
    2020.12.14
    2020.12.13
    2020.12.11
    2020.12.10
    语音合成标记语言(SSML)
    Skyline查询
    win10 VMware 安装 Linux 虚拟机
    图像梯度计算
    Harris Corner Detection
  • 原文地址:https://www.cnblogs.com/raichen/p/5039182.html
Copyright © 2020-2023  润新知