pthread

按比例吃CPU

亡梦爱人 提交于 2019-12-02 23:11:18
前几天测试软件在多核上的性能,需要按照比例吃各个CPU,查了查资料,撸了下面一小段代码; 1 #include <unistd.h> 2 #include <stdlib.h> 3 #include <stdio.h> 4 #include <time.h> 5 6 #define __USE_GNU 7 #include <pthread.h> 8 #include <sched.h> 9 10 //CPU ID号 11 #define CPU_0 0x0 12 #define CPU_1 0x01 13 #define CPU_2 0x02 14 #define CPU_3 0x03 15 16 //总时间和运行时间 17 #define FULL_TIME 100 18 #define RUN_TIME 80 19 20 //时钟HZ数 21 static clock_t clktck; 22 23 //用户参数输入的吃CPU百分比 24 static int eat_cpu_percent; 25 26 //线程绑定CPU 27 int attach_cpu(int cpu_index) 28 { 29 int cpu_num = sysconf(_SC_NPROCESSORS_CONF); 30 if (cpu_index < 0 || cpu_index >= cpu

详解线程的信号量和互斥锁

匿名 (未验证) 提交于 2019-12-02 21:59:42
  前言: 有个问题感觉一直会被问道:进程和线程的区别?也许之前我会回答: 进程:资源分配最小单位 线程:轻量级的进程 是系统调度的最小单位 由进程创建 多个线程共享进程的资源   但是现在我觉得一个比喻回答的更好:程序就像静止的火车,进程是运行的火车,线程是运行火车的每节车厢。 个人感觉理解远比背些概念性东西更好。   一、线程   通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。   1、线程相关函数  pthread_create函数 #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 注: Compile and link with -pthread.//编译时 要加-lpthread 功能:创建线程 参数1:线程的ID 参数2:NULL 参数3:线程处理函数 参数4:

Linux线程唤醒与等待

匿名 (未验证) 提交于 2019-12-02 21:56:30
生产者消费者模式在程序设计中出现频率非常高,经常会有线程间通过消息队列或其他共享变量进行交互的场景。而这时就会出现一个问题,消费者如何知道生产者已经生产了数据呢?有的程序会采取消费者循环判断消息队列大小是否为0,如果不为0则取出数据之类的方法。但是该种方法带来两个问题: 1. 生产者产出数据到消费者获得数据的延时较大。 2. CPU占用较高。 如果需要降低延时,则必然要提高轮询的频率,那么CPU占用就会升高。反之亦然,两者无法同时解决。 于是,唤醒等待机制就成为适合该种场景的解决方案。 该机制需要一个互斥对象以及条件变量共同完成,如下: pthread_cond_t cond = PTHREAD_COND_INITIALIZER; pthread_mutex_t mutex; 其中条件变量使用宏结构常量进行赋值。接下来进行互斥对象与条件变量的初始化: pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); 生产者唤醒逻辑: pthread_mutex_lock(&mutex); pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); 消费者等待逻辑: pthread_mutex_lock(&mutex); pthread_cond_wait(

Linux线程间同步的几种方式

匿名 (未验证) 提交于 2019-12-02 21:56:30
信号量强调的是线程(或进程)间的同步:“信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。当信号量为单值信号量时,也可以完成一个资源的互斥访问。信号量测重于访问者对资源的有序访问,在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。 可以用于不同进程间或多线程间的互斥与同步 创建打开有名信号量 sem_t *sem_open(const char *name, int oflag); sem_t *sem_open(const char *name, int oflag, mode_t mode, unsigned int value); //成功返回信号量指针;失败返回SEM_FAILED,设置errno name是文件路径名,但不能写成/tmp/a.sem这样的形式,因为在linux下,sem都是在/dev/shm目录下,可写成"/mysem"或"mysem",创建出来的文件都是"/dev/shm/sem.mysem",mode设置为0666,value设置为信号量的初始值.所需信号灯等已存在条件下指定O_CREAT|O_EXCL却是个错误。 关闭信号量,进程终止时,会调用它 int sem_close(sem

Unknown CMake command \"check_symbol_exists\".

安稳与你 提交于 2019-12-02 07:19:03
- Using these message generators: gencpp;geneus;genlisp;gennodejs;genpy CMake Error at CMakeLists.txt:59 (check_symbol_exists): Unknown CMake command "check_symbol_exists". -- Configuring incomplete, errors occurred! See also "/home/ht/catkin_ws/src/navigation/amcl/cmake-build-debug/CMakeFiles/CMakeOutput.log". See also "/home/ht/catkin_ws/src/navigation/amcl/cmake-build-debug/CMakeFiles/CMakeError.log". 在clion里面reload cmake project时,发现报错,找不到该库,通过查看error日志,发现是线程没有 CMakeFiles/cmTC_1a3f9.dir/src.c.o: In function `main': src.c:(.text+0x3c): undefined reference to `pthread_create' src.c:(.text

iOS: 线程中那些常见的锁

拟墨画扇 提交于 2019-12-02 06:13:15
一、介绍 在多线程开发中,锁的使用基本必不可少,主要是为了解决资源共享时出现争夺而导致数据不一致的问题,也就是线程安全问题。锁的种类很多,在实际开发中,需要根据情况选择性的选取使用,毕竟使用锁也是消耗CPU的。 本人虽然一直有使用多线程进行开发,但是对于锁的使用和理解并不是特别的深入,这不看到一篇挺mark的博客: https://www.jianshu.com/p/a236130bf7a2 ,在此基础上稍添加点东西转载过来(尊重原创),一是为了记录便于随时翻阅,而是为了写一遍加深印象,知识都是一个copy和attract的过程。 二、种类 1、互斥锁 概念:对共享数据进行锁定,保证同一时刻只能有一个线程去操作。 抢到锁的线程先执行,没有抢到锁的线程就会被挂起等待。 等锁用完后需要释放,然后其它等待的线程再去抢这个锁,那个线程抢到就让那个线程再执行。 具体哪个线程抢到这个锁是由cpu调度决定的。 常用: @synchronized:同步代码块 example:执行操作 /** *设置属性值 */ -(void)setMyTestString:(NSString *)myTestString{ @synchronized(self) { // todo something _myTestString = myTestString; } } example:创建单例 //注意

Linux中的各种锁及其基本原理

风流意气都作罢 提交于 2019-12-02 04:56:37
Linux中的各种锁及其基本原理 1.概述 通过本文将了解到如下内容: Linux系统的并行性特征 互斥和同步机制 Linux中常用锁的基本特性 互斥锁和条件变量 2.Linux的并行性特征 Linux作为典型的多用户、多任务、抢占式内核调度的操作系统,为了提高并行处理能力,无论在内核层面还是在用户层面都需要特殊的机制来确保任务的正确性和系统的稳定运行,就如同一个国家需要各种法律条款来约束每个公民的行为,才能有条不紊地运转。 在内核层面涉及到各种软硬件中断、进线程睡眠、抢占式内核调度、多处理器SMP架构等,因此内核在完成自己工作的时候一直在处理这些资源抢占的冲突问题。 在用户层面的进程,虽然Linux作为虚地址模式操作系统,为每个进程开辟了独立的虚拟地址空间,伪独占式拥有资源,但是仍然存在很多场景不得不产生多个进程共享资源的问题,来完成进程间的通信,但是在Go语言中进程间的通信使用消息来完成,处理地更优雅一些。 在线程层面,线程作为进程的一部分,进程内的多个线程只拥有自己的独立堆栈等少量结构,大部分的资源还是过线程共享,因此多线程的资源占用冲突比进程更加明显,所以多线程编程的线程安全问题是个重难点。综上可知,无论在kernel还是user space都必须有一些机制来确保对于资源共享问题的解决,然后这个机制就是接下来要说的:同步和互斥。 3.同步和互斥机制 基本概念

POSIX 多线程程序设计-概述

二次信任 提交于 2019-12-01 21:49:11
术语定义 同步与异步 同步(synchronous)意味着同时在一起工作。例如聊天室和在线会议就是同步的好例子,在聊天室中,人们对彼此的对话会立即得到反应。 同步相对来说比较简单,但开销相对较大。 异步(asynchronous) 表明事情相互独立地发生, 异步双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送。例如论坛和电子邮件就是采用异步通信的一个好例子,这样沟通的双方都会有足够的时间去思考。 异步增加了复杂性以及更加麻烦的调试过程。如果你没有同时执行多个活动, 那么异步就没有什么优势。 如果你开始了一个异步活动, 然后什么也不做等待它结束, 则你并没有从异步那儿获得太多好处。 并发与并行 并发(concurrency ) 的意思是指事情同时发生。 也是指让实际上可能串行发生的事情好像同时发生一样。 并发描述了单处理器系统中线程或进程的行为特点。在 POSIX 中,并发的定义要求“延迟调用线程的函数不应 该导致其他线程的无限期延迟。 并行(parallelism) 指并发序列同时执行, 换言之,软件中的“并行”语言中的“并发”是相同的意思, 而区別于软件中的“并发”。指事情在相同的方向上独立进行(没有交错)。 真正的并行只能在多处理器系统中存在, 但是并发可以在单处理器系统和多处理器系统中都存在。 并发能够在单处理器系统中存在是因为并发实际上是并行的假象。

[TLPI] C30 Threads: Thread Synchronization

旧城冷巷雨未停 提交于 2019-12-01 19:18:41
目录 THREADS: THREAD SYNCHRONIZATION Protecting Accesses to Shared Variables: Mutexes Statically Allocated Mutexes Locking and Unlocking a Mutex Performance of Mutexes Mutex Deadlocks Dynamically Initializing a Mutex Mutex Attributes Mutex Types Signaling Changes of State: Condition Variables Statically Allocated Condition Variables Singaling and Waiting on Condition Variables Testing a Condition Variable's Predicate THREADS: THREAD SYNCHRONIZATION Protecting Accesses to Shared Variables: Mutexes The term critical section is used to refer to a section of code that accesses a shared resource and

线程4——清理

╄→尐↘猪︶ㄣ 提交于 2019-12-01 09:05:36
void pthread_cleanup_push(void (*routine)(void *),void *arg);   第一个参数:指向需要执行的函数   arg为该函数的参数 void pthread_cleanup_pop(int execute);   int整形数字,非零为执行清理函数 两个函数成对使用 先把函数写进routine里,调用push函数去装routine,然后在用pop让push发挥作用 什么时候会触发push函数? 1、线程结束时,调用pthread_exit() 2、取消线程相应pthread_cancel 3、非零参数调用pthread_cleanup_pop() 1 pthread_cleanup_push(cleanup_handler1,(void*)1); 2 pthread_cleanup_push(cleanup_handler2,(void*)2); 3 pthread_cleanup_push(cleanup_handler3,(void*)3); 4 //按照1、2、3函数顺序进行压栈 5 6 pthread_cleanup_pop(1); 7 pthread_cleanup_pop(1); 8 pthread_cleanup_pop(1); 9 pthread_exit(0); 最先被执行的时handler3