linux中多线程处理

明确liunx多线程的概念
线程:轻量级进程,即同一进程中多个线程共享该进程中的全部系统资源(虚拟内存空间、文件描述、信号处理)。但每个线程的调用栈、寄存器、线程本地存储(TLS:Thread Local Storage).
1:明确线程共享的资源是哪些:
2:线程始终围绕的是如果共享进程的资源,已经如何在进程中独立。
多线程的同步与互斥(mutex)(Mutual exclusion)
方式一:锁
主线程中初始化为解锁状态:
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL)
编译时初始化锁为解锁状态:
pthread_mutex_t mutex=PTHREAD_MUTEX_INITALIZE
访问对象的加锁与解锁
加锁: pthread_mutex_lock(&mutex);
方式二:信号量(Semaphore)
信号量本质是一个正整数,它也被用来控制对公共资源的访问。当公共资源增加的时候,调用信号量增加函数sem_post()对其进行增加,当公共资源减少的时候,调用函数sem_wait()来减少信号量。其实,我们是可以把锁当作一个0-1信号量的。
3:线程的生命周期
a:线程的创建
pthread_create
pthread_join()即是子线程合入主线程,主线程阻塞等待子线程结束,然后回收子线程资源。(阻塞的意思是 主线程会在调用 pthread_join()处等待,直到子线程消亡了才会继续往下执行。)
pthread_detach()即主线程与子线程分离,子线程结束后,资源自动回收。
分离意思是主线程不能再用pthread_join()和子线程同步,就是说对子线程调用 pthread_detach之后,主线程再调用pthread_join()不会导致等待主线程阻塞等待,这时候主线程和子线程相当于两个执行序列,两者之间处于一种分离状态,子线程自己清理线程资源,而不是主在join处等待。如果子线程执行还没结束,但主线程结束了,整个进程结束,会导致不回收子线程资源,导致资源泄露。线程资源主要是线程所占用堆栈和线程描述符等。

#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
//#include
void *th1(void *arg)
{
  int i=0;
  pthread_detach(pthread_self());
  for(i=0;i<20;i++)
  {       printf("create thread times=%d\n",i);
        usleep(1);
  }
}
int main()
{
pthread_t pt;
pthread_create(&pt,NULL,th1,NULL);
int i=0;
for (i=0;i<10;i++)
{       printf("main thread times=%d\n",i);
//usleep(1);
}
//pthread_join(pt,NULL);
printf("main end!\n");
return 0;
}

上面例子中,如果main执行太快,导致子线程函数th1没有执行完,即使pthread_detach,也会导致资源泄露,在进行多线程时需要切记。
注意pthread_join,是调用线程在pthread_join进行等待子线程结束后再进行下面操作。可以用valgrind进行内存检测。
需要注意的是编码时要 明确pthread_join还是pthread_detach

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值