多线程(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);    

unix c 11的更多相关文章

  1. 0级搭建类005-Oracle Solaris Unix安装 (11.4) 公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  2. Unix历史及相关概念回顾

    欢迎来到Unix的世界 很多人都用了很多年的Unix(其实更熟悉的是叫Linux),也接触到Unix世界中的各种概念,比如GCC.GNU.BSD.POSIX.GPL等等,也大都知道一些传奇的如雷贯耳的 ...

  3. UnixShell编程(第三版)

    这本书相当老了,04年的,现在  在linux上做实验. 1,date 显示日期. 2,who  显示用户,who am i 3,echo 后面字符串会全部输出,,会过滤掉多余空格,单双引号,分号等. ...

  4. lsof 命令用法详解

    lsof 命令用法详解 作用 用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所 ...

  5. Docker: 安装配置入门[二]

    一.安装配置启动 1.环境 [root@docker1 ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@d ...

  6. Redis<六> Key通用操作

    1). KEYS pattern : 查找所有符合给定模式 pattern 的 key . 如 keys * , keys *list* 2). DEL key [key ...] : 删除给定的一个 ...

  7. Linux服务之nginx服务篇五(静态/动态文件缓存)

    一.nginx实现静态文件缓存实战 1.nginx静态文件缓存 如果要熟练使用nginx来实现文件的缓存,那下面的几个指令你必须要牢记于心 (1)指令1:proxy_cache_path 作用:设置缓 ...

  8. 地区sql

    /*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...

  9. 转connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable)

    网站常出现502 bad gateway,程序没有问题. 根据nginx日志:connect() to unix:/var/run/php-fpm.sock failed (11: Resource ...

随机推荐

  1. win8开机密码忘了怎么办

    原文地址:http://zhidao.baidu.com/question/582486883100064325.html windows8系统虽然让众用户用着不习惯,但是还是拥有大批追随者.今天,绿 ...

  2. Thinkphp 3.2 中词分词 加权搜索

    原文地址:http://www.cnblogs.com/kekukele/p/4544349.html 前段时间,利用业余时间做了一个磁力搜索的网站Btdog,其中使用到了简单的中文分词与加权搜索,在 ...

  3. poj 1742 Coins(dp之多重背包+多次优化)

    Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...

  4. poj 3176 Cow Bowling(dp基础)

    Description The cows don't use actual bowling balls when they go bowling. They each take a number (i ...

  5. python高级编程:有用的设计模式2

    # -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...

  6. 使用HashMap对象传递url參数有用工具类

    代码例如以下: package com.yanek.util; import java.util.ArrayList; import java.util.Collections; import jav ...

  7. Builder模式 初体验

        看来Java构造器模式,决定动手体验下.构造器模式是什么?干什么用的?推荐大家看下ITEYE的一篇文章     http://www.iteye.com/topic/71175     了解构 ...

  8. JavaScript深拷贝和浅拷贝

    1. 基本类型 和 对象类型 他们最大的区别就是在于他们的传值方式. 基本类型是传值 对象类型就是传引用. 这里复制一份obj叫做obj2, 这里修改了obj2的b为100 同时也修改了obj1.b. ...

  9. bit、byte、位、字节、字符串等概念

    原始文章:http://djt.qq.com/article/view/658 1.古代送信:马车,烽火,信鸽 2.1837年,世界第一条电报诞生, 美国科学家莫尔斯尝试用一些“点”和“划”来表示不同 ...

  10. C# 大小写转换

    全部大写: string upper = str.ToUpper() 全部小写: string lower = str.ToLower(); str是需要转换的字符.