• 多线程


    #线程相对于进程的优点:

      线程的创建和上下文切换比进程的创建和上下文切换更快。

      线程间交换数据时无需特殊技术。

    #线程和进程的差异: 

      多进程>每个进程的内存空间都由保存全局变量的“数据区”、malloc等函数动态分配提供空间的堆(Heap)、函数运行时使用到的栈(Stack)构成。每个进程都具有这种独立空间。

      多线程>多个线程将共享数据区和堆。

    #多个线程同时调用函数时(执行时)可能产生问题。这类函数内部存在临界区(多个线程同时执行这部分代码时,可能引起问题)

      根据临界区是否引起问题,函数分为两类:线程安全函数,非线程安全函数。

      线程安全函数的名称后缀一般为_r

      多个线程访问同一变量会产生问题,一个线程访问变量时应该阻止其他线程访问。这就是同步。

      临界区:临界区并非变量本身,而是访问变量和计算过程的语句。这些语句可能由多个线程同时运行,这也是引起问题的直接原因。

    #线程同步

      同步的情况从两方面考虑:

        同时访问同一内存空间时发生的情况

        需要指定访问同一内存空间的线程执行顺序的情况

      互斥量:

        互斥量的创建及销毁函数

         #include<pthread.h>  

         int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); 

         int pthread_mutex_destroy(pthread_mutex_t *mutex);    

          ·mutex 创建和销毁互斥量时传递保存互斥量的变量地址值

         ·attr 传递即将创建的互斥量属性,没有特别需要指定的属性时传递NULL 

        →成功时返回0,失败返回其他值 

        利用互斥量锁住或释放临界区时使用的函数

         int pthread_mutex_lock(pthread_mutex_t *mutex); 

         //临界区的开始 

         //...........

         //临界区的结束 

         int pthread_mutex_unlock(pthread_mutex_t *mutex); 

        成功时返回0,失败返回其他值 

        死锁:线程退出临界区时,如果没有调用pthread_mutex_unlock函数,其他为了进入临界区而调用

           pthread_mutex_lock的线程就无法摆脱阻塞状态。这种情况就是死锁(Dead-lock)

      信号量:

  • 相关阅读:
    [LeetCode][JavaScript]Combination Sum II
    [LeetCode][JavaScript]Generate Parentheses
    [LeetCode][JavaScript]Contains Duplicate
    [LeetCode][JavaScript]Regular Expression Matching
    [LeetCode][JavaScript]Combination Sum
    [LeetCode][JavaScript]Two Sum
    Windows Live Writer的Markdown插件MarkdownInLiveWriter支持语法高亮了
    各种Markdown处理器的列表
    用ChooseALicense帮自己选一个开源license,然后用AddALicense给自己的github自动加上license文件
    遇到奇怪的C#/C/C++或者Java的bug可以去问问Coverity
  • 原文地址:https://www.cnblogs.com/itsad/p/8053577.html
Copyright © 2020-2023  润新知