线程创建偶尔失败问题

一、创建一个线程,里面设置一个死循环,在销毁线程时间循环标志设置为false,并return,该线程是退出了,但是有没有将资源自动释放呢?

所遇问题:在多个视频循环播放的时候,程序运行十个小时左右并挂掉,提示创建线程失败,可能原因是在主线程退出之后该线程并没有释放资源,导致下次重新创建同一个线程而失败。

分析:linux线程执行有两种状态,分别是joinable状态和unjoinable状态,这与windows是有区别的;

1、如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符等,大概8K左右,只有当你调用了pthread_join之后这些资源才会被释放。

2、若是unjoinable状态的线程,所拥有的资源在线程函数退出时或pthread_exit时自动会被释放。

关于线程状态可以再创建线程的时候指定并设置,例如GThread* g_thread_create(GTreadFunc func, gpinter data, gboolean joinable, GError **error);

如果joinable设置为TRUE,则可以通过g_thread_join来结束线程。

时间: 2024-11-03 01:40:37

线程创建偶尔失败问题的相关文章

线程创建代码

#include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <string.h> #include <sys/syscall.h> #include <unistd.h> #include <fcntl.h> #include <errno.h> #ifndef T_DESC #define T_DESC(x, y) (y) #end

windows下线程创建

windows下线程创建: CreateThread()函数是Windows提供的API接口 1.HANDLE WINAPI CreateThread( LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThreadId ); 函数说明: 第一个参数表示

linux 线程创建

一.线程的概念    进程在各个独立的地址空间中运行,进程之间共享数据需要mmap或者进程间通信机制,本节我们学习如何在一个进程的地址空间中执行多个线程.    有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了场,如实现一个图形界面的下载软件,需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一个" 等待-处理"的循环,可以用多线程实现,一个线程专门 负责与用户交互,另外几个线程每个线程负责和

理解Android线程创建流程(转)

/android/libcore/libart/src/main/java/java/lang/Thread.java /art/runtime/native/java_lang_Thread.cc /art/runtime/native/java_lang_Object.cc /art/runtime/thread.cc /system/core/libutils/Threads.cpp /system/core/include/utils/AndroidThreads.h /framewor

pthread_create线程创建的过程剖析(转)

概述 在Linux环境下,pthread库提供的pthread_create()API函数,用于创建一个线程.线程创建失败时,它可能会返回ENOMEM或EAGAIN.这篇文章主要讨论线程创建过程中碰到的一些问题和解决方法. 创建线程 首先,本文用的实例代码example.c: /* example.c*/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h&g

pthread_create线程创建的过程剖析

http://blog.csdn.net/wangyin159/article/details/47082125 在Linux环境下,pthread库提供的pthread_create()API函数,用于创建一个线程.线程创建失败时,它可能会返回ENOMEM或EAGAIN.这篇文章主要讨论线程创建过程中碰到的一些问题和解决方法. 创建线程 首先,本文用的实例代码example.c: /* example.c*/#include <stdio.h>#include <stdlib.h>

hive创建表失败,drop表失败

一.hive创建表失败,报错: CREATE TABLE pokes (foo INT, bar STRING);FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:javax.jdo.JDODataStoreException: An exception was thrown while adding/validating class(

iOS-Senior10-多线程(子线程创建)

1.多线程概述 程序:由源代码生成的可执行应用.(eg:QQ.app) 进程:一个正在运行的程序可以看做一个进程.(eg:正在运行的QQ就是一个进程),进程用用独立运行所需的全部资源. 线程:程序中独立运行的代码段.(eg:接收QQ消息的代码) 一个进程是由一或多个线程组成.进程只负责资源的调度和分配,线程才是程序真正的执行单元,负责代码的执行. 1.1单线程 每个正在运行的程序(即进程),至少包含一个线程,这个线程就叫主线程. 主线程在程序启动时被创建,用于执行main函数. 只有一个主线程的

iOS开发——多线程OC篇&amp;(二)线程创建

创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil]; [thread start]; // 线程一启动,就会在线程thread中执行self的run方法 主线程相关用法 + (NSThread *)mainThread; // 获得主线程 - (BOOL)isMa