zoukankan      html  css  js  c++  java
  • unix c 11

    多线程(thread)
       操作系统支持多进程,进程内部使用多线程。
       进程是 重量级的,拥有自己 独立的内存空间。
       线程是 轻量级的,不需要拥有自己 独立的内存空间,线程的内存空间:1 共享进程的内存空间 2 每个线程拥有一个与其他线程独立的栈。
       因此,遇到大量的并行,多半使用多线程技术。

      一般来说,网络编程 离不开多线程。
       进程中支持多线程,但必须有一个主线程(main)。
       多个线程之间互相独立,但也互相影响(共享进程的内存)。
       主线程和其他线程也是独立的,但有特殊性:
           1 其他线程都是通过主线程 直接/间接 启动
           2 主线程结束,进程结束->所有线程都结束

      线程并行的原理和机制
         传统上说,代码有三种运行的方式:
               顺序执行/循环执行/选择执行
       代码的并行:
        真正意义的并行 是不存在的,我们看到的并行都是针对时间段的。
        CPU把自己工作时间分成 极小的CPU时间片,每个线程都会拿到CPU时间片,CPU时间片的持有者可以运行CPU(CPU时间片的大小决定运行时间)。当我们感知(过了时间段)的时候,多个线程都运行了N个时间片,因此感觉上是并行。
        UC中对于线程的开发已经做了一系列的函数,放入libpthread.so中。因此 连接时,需要加-lpthread,l可以省略,所有线程的函数 在连接时必须加 -pthread。
        使用pthread.h头文件,都以pthread_ 开头。
        创建线程函数:
        int pthread_create(pthread_t* id,  pthread_attr_t* attr, void*(*f)(void*), void* p )
            id 用于存储 线程id
            attr 传入属性,一般给NULL,使用默认属性即可
            f 是函数指针,线程执行的代码放入f函数
            p 是f的参数,可以在创建线程时传入

       返回:
          成功返回0,失败 返回 错误编号。线程的错误码不能使用errno,而是 由函数直接返回。
       注:函数f不需要显式调用,create线程后自动执行f的代码,同时 p 做f的参数。
       关于函数的返回:
       1 不能返回指向局部变量的指针
       2 不要直接返回 复合类型的局部变量
       3 只有指向 static 局部变量的指针可以返回

      线程 用 pthread_join 取返回值。

       线程有分离和非分离状态,默认是 非分离状态,支持pthread_join,并且资源在join函数结束之后才释放,而不是 线程结束马上释放。      
       分离状态 线程结束马上释放资源,处于分离状态的线程join没作用。(了解)
       pthread_detach(id);//可以把线程id设置为分离

      线程同步:
       线程 共享进程的系统资源(全部、堆、文件),如果一个线程改变了其中的某项,就会影响其他的线程。因此多个线程在操作共享资源时,使用 线程同步 技术防止数据出现不一致,不完整的问题。
       互斥(mutex)就是一种线程同步的技术。能解决同步问题,但 会大幅降低多线程的效率,所以不要滥用

      互斥的使用步骤:
       1 定义一个互斥
         pthread_mutex_t lock;
       2 初始化 互斥,两种方式:
         lock = PTHREAD_MUTEX_INITIALIZER;
         pthread_mutex_init(&lock);
       3 加锁,取互斥(只有一个可以取得,其他被锁定)
         pthread_mutex_lock(&lock);
       4 执行自己的代码
       5 释放锁,还互斥(激活被锁定的线程)
         pthread_mutex_unlock(&lock);
       6 销毁互斥(不能再次使用)
         pthread_mutex_destroy(&lock);

       在使用互斥时,一定要避免死锁,因此没有及时释放互斥导致其他所有线程 锁死。
       互斥是线程同步的特有技术,而信号量是可以控制进程和线程的技术。(与IPC的信号量集不是一个技术)

    信号量是一个计数器,当 计数为1 时,和互斥效果一致。信号量的使用步骤:
        1 定义一个信号量
         sem_t sem; //不在pthread.h中,在semaphore.h
        2 初始化信号量
         sem_init(&sem,0,int 计数值)
         第一个参数是 信号量的指针
         第二个参数必须是0,0代表线程,非0代表进程
         第三个参数是计数器的初始值
        3 获取一个信号量(计数-1)
         sem_wait(&sem);
        4 执行代码
        5 释放一个信号量(计数+1)
         sem_post(&sem);
        6 不用了就可以销毁
         sem_destroy(&sem);    

  • 相关阅读:
    奥东......NGUI Scroll View
    奥东......Unity中小技巧
    java-web 小知识点
    奥东here......Unity中的协程
    JAVA 犯错汇总
    python 模拟 java hashcode
    pyqt文件转换成python代码
    loadrunner 运行javavuser报错Failed to get JRE version解决方法
    python 实现 loadrunner xml脚本格式化
    loadrunner web_custom_request 脚本处理
  • 原文地址:https://www.cnblogs.com/elisha-blogs/p/3771191.html
Copyright © 2011-2022 走看看