pthread_create

不可思议的OOM

无人久伴 提交于 2020-03-22 03:10:17
本文发现了一类OOM(OutOfMemoryError),这类OOM的特点是崩溃时java堆内存和设备物理内存都充足,下文将带你探索并解释这类OOM抛出的原因。 关键词: OutOfMemoryError, OOM,pthread_create failede, Could not allocate JNI Env 一、引子 对于每一个移动开发者,内存是都需要小心使用的资源,而线上出现的 OOM(OutOfMemoryError)都会让开发者抓狂,因为我们通常仰仗的直观的堆栈信息对于定位这种问题通常帮助不大。网上有很多资料教我们如何“紧衣缩食“的利用宝贵的堆内存(比如,使用小图片,bitmap 复用等),可是: 线上的 OOM 真的全是由于堆内存紧张导致的吗? 有没有 App 堆内存宽裕,设备物理内存也宽裕的情况下发生 OOM 的可能? 内存充裕的时候出现 OOM 崩溃? 看似不可思议,然而,最近笔者在调查一个问题的时候,通过自研的 APM 平台发现公司的一个产品的大部分 OOM 确实有这样的特征,即: OOM 崩溃时,java 堆内存远远低于 Android 虚拟机设定的上限,并且物理内存充足,SD 卡空间充足 既然内存充足,这时候为什么会有 OOM 崩溃呢? 二、问题描述 在详细描述问题之前,先弄清楚一个问题: 什么导致了 OOM 的产生? 下面是几个关于 Android

生产者消费者模型、读者写者模型

耗尽温柔 提交于 2020-03-17 08:22:04
生产者与消费者模型 什么是生产者消费者模型 某个模块负责产生数据,这些数据由另一个模块来负责处理,产生数据的模块,形象地称为生产者,而处理数据的模块,就称为消费者,该模式还需有一个缓冲区处于生产者和消费者之间,作为一个中介,生产者把数据放入缓冲区,而消费者从缓冲区取出数据。在多线程编程中阻塞队列(Blocking Queue)是一种常用于实现生产者和消费者模型的数据结构。其与普通的队列区 别在于:当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存 放元素的操作也会被阻塞,直到有元素被从队列中取出 为什么要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯, 而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生 产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个 阻塞队列就是用来给生产者和消费者解耦的。 生产者与消费者之间的关系 1.三种关系:生产者与生产者(互斥)、消费者与消费者(互斥)、生产者与消费者(互斥、同步) 2.两种角色:生产者 、消费者 3.一种场所:为生产者与消费者提供数据单元的缓冲区 为了方便记忆:321原则 生产者与消费者模型的优点 1、解耦合

多线程编程总结

非 Y 不嫁゛ 提交于 2019-12-23 18:52:12
使用POSIX编写多线程C++程序 创建线程 #include <pthread.h> pthread_create(thread,attr,start_routine,arg) pthread_create创建一个新的线程。下面是各参数的说明: 参数 描述 thread 指向线程标识符指针。 attr 一个不透明的属性对象,可以被用来设置线程属性。您可以指定线程属性对象,也可以使用默认值 NULL。 start_routine   线程运行函数起始地址,一旦线程被创建就会执行。 arg   运行函数的参数。它必须通过把引用作为指针强制转换为 void 类型进行传递。如果没有传递参数,则使用 NULL。 终止线程 #include <pthread.h> pthread_exit(status) pthread_exit 用于显式地退出一个线程。 在主线程中调用pthread_exit, 则仅仅是主线程结束,进程不会结束,进程内的其他线程也不会结束,直到所有线程结束,进程才会终止。 下面通过实例来感受一下改函数的作用。 #include <iostream> #include <pthread.h> #include <unistd.h> using namespace std; #define NUM_THREADS 5 void* say_hello(void* args) {

多线程排序程序

大憨熊 提交于 2019-12-09 03:49:17
程序描述 此程序实现了多线程的数组排序,可将一个数组拆分为两部分交由两个线程来排序,最后由父进程对其总和。 程序功能实现代码预览 定义一个结构来存排序算法所需要的参数 typedef struct //结构体用来存排序算法需要的参数 { int start; int end; }Para; 一个简单的冒泡排序 void sort(Para* para){ int i,j,temp; for (i=para->start;i<para->end;i++){ for (j=para->end;j>i;j--){ if (elem[j]<elem[j- 1 ]){ temp=elem[j]; elem[j]=elem[j- 1 ]; elem[j- 1 ]=temp; } } } pthread_ exit ( 0 ); } 实现对程序计时 int t_start=clock(); int t_end=clock(); 将上面的代码分别放在程序首尾,最后相减即可得出运行时间 printf ( "耗时:%d\n" , t_end-t_start); 注:此时间为CPU时间,两个核的话会把两个核的时间加起来。可以在程序名前面加time即可最后得出各种运行时间。 time ./a.out 创建两个线程 pthread_t tid1,tid2; //线程的identifier pthread

条件变量---生产者消费者问题

不羁的心 提交于 2019-12-04 22:05:00
假设有一个生产者线程,一个消费者线程,生产一个,消费一个。我们来看看怎么实现。 #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> int buffer; int count = 0; void put(int value) { assert(count == 0); count = 1; buffer = value; } int get() { assert(count == 1); count = 0; return buffer; } void *producer(void *arg) { printf("producer...\n"); int i; int loops = (int) arg; for (i = 0; i < loops; i++) { put(i); printf("put:%d\n",i); } } void *consumer(void *arg) { printf("consumer...\n"); int i; while(1) { int tmp = get(); printf("%d\n",tmp); } } int main() { printf("begin...\n"); pthread_t p; pthread_create(

CMake does not properly find CUDA library

匿名 (未验证) 提交于 2019-12-03 02:31:01
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 问题: I'm trying to build a program that requires CUDA. To the CMake script I supply: cmake -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda .. CUDA is found and CMake runs normally: staudt ~/workspace/clutbb/cluster/build $ cmake -D CUDA_TOOLKIT_ROOT_DIR=/usr/local/cuda .. -- Found CUDA: /usr/local/cuda (found version "6.5") -- Found Intel TBB -- Boost version: 1.56.0 -- Found the following Boost libraries: -- iostreams -- program_options -- Looking for include file pthread.h -- Looking for include file pthread.h - found -- Looking for pthread_create --

linux环境下多线程编程

匿名 (未验证) 提交于 2019-12-02 21:56:30
一、Linux环境下的线程   相对于其他操作系统,Linux系统内核只提供了轻量级进程的支持,并未实现线程模型。Linux是一种“多进程单线程”的操作系统,Linux本身只有进程的概念,而其所谓的“线程”本质上在内核里仍然是进程。   进程是资源分配的单位,同一进程中的多个线程共享该进程的资源(如作为共享内存的全局变量)。Linux中所谓的“线程”只是在被创建时clone了父进程的资源,因此clone出来的进程表现为“线程”,这一点一定要弄清楚。因此,Linux“线程”这个概念只有在打引号的情况下才是最准确的。   目前Linux中最流行的线程机制为LinuxThreads,所采用的就是线程-进程“一对一”模型,调度交给核心,而在用户级实现一个包括信号处理在内的线程管理机制。LinuxThreads由Xavier Leroy负责开发完成,并已绑定在GLIBC中发行,它实现了一种BiCapitalized面向Linux的Posix 1003.1c “pthread”标准接口。Linuxthread可以支持Intel、Alpha、MIPS等平台上的多处理器系统。   需要注意的是,Linuxthread线程模型存在一些缺陷,尤其是在信号处理、调度和进程间同步原语方面都存在问题。并且,这个线程模型也不符合POSIX标准的要求。为了解决LinuxThread的缺陷

线程属性与调度学习

故事扮演 提交于 2019-11-27 07:20:45
线程属性: 1.线程的分离状态   线程的分离状态决定一个线程以什么样的方式来终止自己。非分离的线程终止时,其线程ID和退出状态将保留,直到另外一个线程调用pthread_join.分离的线程在当它终止时,所有的资源将释放,我们不能等待它终止。 设置线程分离状态的函数为 pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)。第二个参数可选为PTHREAD_CREATE_DETACHED(分离线程)和 PTHREAD _CREATE_JOINABLE(非分离线程)。这里要注意的一点是,如果设置一个线程为分离 线程,而这个线程运行又非常快,它很可能在 pthread_create函数返回之前就终止了,它终止以后就可能将线程号和系统资源移交给其他的线程使用,这样调用pthread_create的线程就得到了错误的线程号。要避免这种情况可以采取一定的同步措施,最简单的方法之一是 可以在被创建的线程里调用 pthread_cond_timewait函数,让这个线程等待一会儿,留出足够的时间让函数pthread_create返回。设置一段等待时间,是在多线程编程里常用的方法。(https://www.cnblogs.com/lidabo/p/5009249.html) 2.线程栈末尾的警戒缓冲区大小 3

分离式线程

主宰稳场 提交于 2019-11-27 00:43:06
1、技术都是为了解决实际问题的,考虑下面的场景: 主线程创建一个子线程,子线程做一些任务,在主线程上,等待子线程完成任务,然后向下运行。代码如下: #include <stdio.h> #include <pthread.h> #include <unistd.h> void* FuncA(void* arg) { printf("FuncA Time[%d]\n", time(NULL)); sleep(2); } int main(int argc,char* argv[]) { pthread_t threadA; pthread_create(&threadA, NULL, FuncA, NULL); pthread_join(threadA,NULL); printf("main Time[%d]\n", time(NULL)); getchar(); return 0; } [niu_zibin@localhost thread]$ g++ -o main main.cpp -lpthread [niu_zibin@localhost thread]$ ./main FuncA Time[1477297071] main Time[1477297073] 2、可以看到,主线程阻塞在pthread_join,那么问题来了,如何让主线程不阻塞在pthread_join呢?

线程详解(下)

吃可爱长大的小学妹 提交于 2019-11-26 04:57:55
四·线程函数 1. 创建线程 # include <pthread.h> int pthread_create ( pthread_t * thread , const pthread_attr_t * attr , void * ( * start_routine ) ( void * ) , void * arg ) ; 功能:创建线程 thread:获取线程ID attr:创建线程时所需要的属性设置,如果为NULL按照默认方式创建线程。 start_routine:线程的入口函数 arg:给线程入口函数传递的参数 # include <stdio.h> # include <unistd.h> # include <pthread.h> void * start_run ( void * arg ) { printf ( "--%s--\n" , ( char * ) arg ) ; while ( 1 ) { printf ( "*" ) ; fflush ( stdout ) ; sleep ( 1 ) ; } } int main ( ) { char * str = "aaaa" ; pthread_t pid ; pthread_create ( & pid , NULL , start_run , str ) ; while ( 1 ) { printf ( "#