嵌入式 线程示例不错哦

原创 2013年12月02日 14:50:09

阻塞线程:

voidjss_req(SOCK_ATTR *sock_attr)
{

 int tmp,i;
 pthread_t thread;
 pthread_attr_t    attr;
 int data_len = 6 ;
 sock_attr->status = 0;
 sock_attr->timeout_ms = 65;
 
 do{

  sock_attr->joseph_sock_write= joseph_tcp_write;
  sock_attr->joseph_sock_read= joseph_tcp_read;

  pthread_attr_init(&attr);
  pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
  pthread_create(&thread,&attr, jss_ssl_thr,(void *)sock_attr);
  pthread_join(thread,NULL);
  //if(sock_attr->ssl_connection)SSL_shutdown(sock_attr->ssl); //alert to thepeer
  
 }while(0);
 close(sock_attr->sockfd);
 eric_print("%s %d  peerconnection closed ..\n",__FILE__,__LINE__);
 return;
}

非阻塞(主线程不等待子线程退出就自己退出,但是主程序要存在):

 

voidhandle_connection(SOCK_ATTR sock_attr)
{
 pthread_t thread0;
 pthread_attr_t    attr;
 pthread_attr_init(&attr);
 sock_attr.lock = 1;
 //pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE);
 pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
 pthread_create(&thread0,&attr, repreq, &sock_attr);
 //pthread_join(thread0, NULL);
 while(sock_attr.lock){};
 return;
 

}

 

设置分离状态

如果创建分离线程(PTHREAD_CREATE_DETACHED),则该线程一退出,便可重用其线程 ID 和其他资源。如果调用线程不准备等待线程退出,请使用 pthread_attr_setdetachstate(3C)

pthread_attr_setdetachstate(3C) 语法


int pthread_attr_setdetachstate(pthread_attr_t *tattr,int detachstate);

#include 



pthread_attr_t tattr;

int ret;





ret = pthread_attr_setdetachstate(&tattr,PTHREAD_CREATE_DETACHED);

如果使用 PTHREAD_CREATE_JOINABLE 创建非分离线程,则假设应用程序将等待线程完成。也就是说,程序将对线程执行 pthread_join()

无论是创建分离线程还是非分离线程,在所有线程都退出之前,进程不会退出。有关从 main() 提前退出而导致的进程终止的讨论,请参见结束


注 –

如果未执行显式同步来防止新创建的分离线程失败,则在线程创建者从 pthread_create() 返回之前,可以将其线程ID 重新分配给另一个新线程。


非分离线程在终止后,必须要有一个线程用 join来等待它。否则,不会释放该线程的资源以供新线程使用,而这通常会导致内存泄漏。因此,如果不希望线程被等待,请将该线程作为分离线程来创建。


示例 3–1 创建分离线程


#include 



pthread_attr_t tattr;

pthread_t tid;

void *start_routine;

void arg

int ret;





ret = pthread_attr_init (&tattr);

ret = pthread_attr_setdetachstate (&tattr,PTHREAD_CREATE_DETACHED);

ret = pthread_create (&tid, &tattr, start_routine, arg);

pthread_attr_setdetachstate 返回值

pthread_attr_setdetachstate() 成功完成后将返回零。其他任何返回值都表示出现了错误。如果出现以下情况,该函数将失败并返回对应的值。


EINVAL

描述:

指示 detachstate  tattr 的值无效。


这两天在看Pthread 资料的时候,无意中看到这样一句话(man pthread_detach):

Either pthread_join(3) or pthread_detach() should be called for each thread

       that an application creates, so that system resources for the thread can be

       released.  (But note that the resources of all threads are freed when the

       process terminates.)

也就是说:每个进程创建以后都应该调用pthread_join 或pthread_detach 函数,只有这样在线程结束的时候资源(线程的描述信息和stack)才能被释放.

之后又查了pthread_join 但是没有明确说明必须调用pthread_join或 pthread_detach.

但是再查了 Pthread forwin32 pthread_join

When a joinable thread terminates,its memory resources (thread descriptor and stack) are notdeallocated until another thread performs pthread_join on it.Therefore, pthread_join must becalled  once for each joinable thread created toavoid memory leaks.


才知道如果在新线程里面没有调用pthread_join 或pthread_detach会导致内存泄漏, 如果你创建的线程越多,你的内存利用率就会越高,直到你再无法创建线程,最终只能结束进程。

解决方法有三个:
1.  线程里面调用 pthread_detach(pthread_self()) 这个方法最简单
2在创建线程的设置PTHREAD_CREATE_DETACHED属性
3. 创建线程后用 pthread_join() 一直等待子线程结束。

下面是几个简单的例子
1. 调用  pthread_detach(pthread_self())
#include
#include
#include
void *PrintHello(void)
{
pthread_detach(pthread_self());
int stack[1024 * 20] = {0,};
//sleep(1);
long tid = 0;
//printf(“Hello World! It’s me, thread #%ld!\n”, tid);
//pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
pthread_t pid;
int rc;
long t;
while (1) {
printf(“In main: creating thread %ld\n”, t);
rc = pthread_create(&pid, NULL, PrintHello,NULL);
if (rc){
printf(“ERROR; return code from pthread_create() is %d\n”,rc);
//exit(-1);
}
sleep(1);
}
printf(” \n— main End —- \n”);
pthread_exit(NULL);
}
2在创建线程的设置PTHREAD_CREATE_DETACHED属性
#include
#include
#include
void *PrintHello(void)
{
int stack[1024 * 20] = {0,};
//pthread_exit(NULL);
//pthread_detach(pthread_self());
}
int main (int argc, char *argv[])
{
pthread_t pid;
int rc;
long t;
while (1) {
printf(“In main: creating thread %ld\n”, t);
pthread_attr_t attr;
pthread_t thread;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr,PTHREAD_CREATE_DETACHED);
rc = pthread_create(&pid,&attr, PrintHello, NULL);
pthread_attr_destroy (&attr);
if (rc){
printf(“ERROR; return code from pthread_create() is %d\n”,rc);
//exit(-1);
}
sleep(1);
}
printf(” \n— main End —- \n”);
pthread_exit(NULL);
}
3.创建线程后用 pthread_join()一直等待子线程结束。

#include
#include
#include
void *PrintHello(void)
{
int stack[1024 * 20] = {0,};
//sleep(1);
long tid = 0;
//pthread_exit(NULL);
//pthread_detach(pthread_self());
}
int main (int argc, char *argv[])
{
pthread_t pid;
int rc;
long t;
while (1) {
printf(“In main: creating thread %ld\n”, t);
rc = pthread_create(&pid, NULL, PrintHello,NULL);
if (rc){
printf(“ERROR; return code from pthread_create() is %d\n”,rc);
//exit(-1);
}
pthread_join(pid, NULL);
sleep(1);
}
printf(” \n— main End —- \n”);
pthread_exit(NULL);
}

基于ARM嵌入式Linux网络编程实例解析

这段时间,因为项目的需要,了解了一下USBtoNet的驱动,同时采用IOCTL来设置MAC的地址,检测网卡的连接状态等等,因此,就从网络上了解了一下关于网络编程方面的知识....
  • wavemcu
  • wavemcu
  • 2013年01月19日 17:15
  • 6230

java 嵌入式的Web服务器jetty使用例子

  • earbao
  • earbao
  • 2015年12月08日 18:27
  • 11269

关于嵌入式系统的学习路线图

来源:本文乃同济大学软件学院王院长(JacksonWan)在同济网论坛发表的帖子《谈谈软件学院高年级同学的学习方向》的第二部分。三部分依次为:一、关于企业计算方向;二、关于嵌入式系统方向;三、关于游戏...
  • bytxl
  • bytxl
  • 2015年10月22日 19:45
  • 11202

嵌入式——线程实验.ppt

  • 2011年04月07日 13:02
  • 20KB
  • 下载

嵌入式实习-day5-线程

  • 2017年11月20日 10:47
  • 584KB
  • 下载

嵌入式课件\嵌入式linux应用程序编程-线程及socket编程

  • 2009年01月02日 17:51
  • 321KB
  • 下载

推荐一个不错的嵌入式实时系统RT-Thread

RT-Thread是国内少有的,不错的一个实时性操作系统。虽然诞生不久,但绝对是后起之秀。与其他RTOS相比,RT-Thread可谓一支独秀。比较适合选用为嵌入式开发的系统。看看RT-Thread的诞...
  • yyplc
  • yyplc
  • 2012年02月02日 15:11
  • 5083

转一篇介绍开发嵌入式经验的文章,写得不错,比较中肯,适合一看。

如何从零开始开发一款嵌入式产品(20年的嵌入式经验)     来源:www.armjishu.com 作者:jesse 转载请注明出处       首先,如果你有幸看到这篇文章,千万不要试图在...
  • yanxuex
  • yanxuex
  • 2013年11月28日 18:08
  • 557

嵌入式 sqlite3数据库创建、插入、更新、查询、删除、多线程等C编程示例以及多并发完成

/* Author : kj Time : 2014-09-07 Function : josep cvr manage by sqlite3 db */ #include #...
  • skdkjxy
  • skdkjxy
  • 2014年09月12日 19:33
  • 1401

线程问题——同样的程序,在ubuntu中运行和嵌入式中PID表现不同的原因

1. 同一多线程程序,经过编译和交叉编译后,在ubuntu和在我们的ARM板的嵌入式LINUX中运行时候,通过ps 看到的信息不一致:    比如:同样的attr_thread这个程序:    u...
  • hare_Lee
  • hare_Lee
  • 2011年12月20日 14:29
  • 1692
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 线程示例不错哦
举报原因:
原因补充:

(最多只允许输入30个字)