linux 线程退出 Linux系统卸载软件

linux下 c中怎么让才能安全关闭线程

多线程程序中,特别是频繁申请,释放线程的情况下,就要注意线程的关闭,最好使用线程池。

一,线程退出方式

(1)执行完成后隐式退出;

(2)由线程本身显示调用pthread_exit函数退出;

pthread_exit(void* retval);

(3)被其他线程用pthread_cance函数终止:

pthread_cance(pthread_t thread);

二,线程状态

pthread线程有两种状态,joinable(非分离)状态和detachable(分离)状态,默认为joinable。

joinable:当线程函数自己返回退出或pthread_exit时都不会释放线程所用资源,包括栈,线程描述符等(有人说有8k多,未经验证)。

detachable:线程结束时会自动释放资源。

joinable线程执行完后不使用pthread_join的话就会造成内存泄漏。

解决办法:

1、创建线程前设置 PTHREAD_CREATE_DETACHED属性

pthread_attr_t attr;

pthread_t thread;

pthread_attr_init(&attr);

pthread_attr_setdetachstat(&attr, PTHREAD_CREATE_DETACHED);

pthread_create(&thread,&attr,&thread_function, NULL);

pthread_attr_destroy(&attr);

2、当线程为joinable时,使用pthread_join来获取线程返回值,并释放资源。

3、当线程为joinable时,也可在线程中调用 pthread_detach(pthread_self());来分离自己。

linux怎么查看线程阻塞原因

linux查看线程阻塞原因:pthread_join一般主线程来调用,用来等待子线程退出,因为是等待,所以是阻塞的,一般主线程会依次join所有它创建的子线程。

1)执行top命令,或使用-H选项(显示所有线程),找到相关的高CPU的PID。

2)生成thread dump快照(kill-3 PID)。

3)将top命令输出PID转换为HEX格式(16进制)。

4)在thread dump data中搜索nid=<Hex PID>。

5)分析受影响的thread和stack trace,精确定位代码。

特点:

Linux,全称GNU/Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展,Linux得到了来自全世界软件爱好者、组织、公司的支持。

它除了在服务器方面保持着强劲的发展势头以外,在个人电脑、嵌入式系统上都有着长足的进步。使用者不仅可以直观地获取该操作系统的实现机制,而且可以根据自身的需要来修改完善Linux,使其最大化地适应用户的需要。

Linux不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证了系统的安全。在很多企业网络中,为了追求速度和安全,Linux不仅仅是被网络运维人员当作服务器使用,甚至当作网络防火墙,这是Linux的一大亮点。

Linux具有开放源码、没有版权、技术社区用户多等特点,开放源码使得用户可以自由裁剪,灵活性高,功能强大,成本低。尤其系统中内嵌网络协议栈,经过适当的配置就可实现路由器的功能。这些特点使得Linux成为开发路由交换设备的理想开发平台。

Linux线程及同步

linux多线程

1.线程概述

线程是一个进程内的基本调度单位,也可以称为轻量级进程。线程是在共享内存空间中并发的多道执行路径,它们共享一个进程的资源,如文件描述和信号处理。因此,大大减少了上下文切换的开销。一个进程可以有多个线程,也就

是有多个线程控制表及堆栈寄存器,但却共享一个用户地址空间。

2.线程实现

线程创建pthread_create()

所需头文件#include

<pthread.h>

函数原型int

pthread_create

((pthread_t

*thread,

pthread_attr_t

*attr,

thread:线程标识符

attr:线程属性设置

start_routine:线程函数的起始地址

arg:传递给start_routine的参数

函数返回值

成功:0

出错:-1

线程退出pthread_exit();

所需头文件#include

<pthread.h>

函数原型void

pthread_exit(void

*retval)

函数传入值retval:pthread_exit()调用者线程的返回值,可由其他函数如pthread_join

来检索获取

等待线程退出并释放资源pthread_join()

所需头文件#include

<pthread.h>

函数原型int

pthread_join

((pthread_t

th,

void

**thread_return))

函数传入值

th:等待线程的标识符

thread_return:用户定义的指针,用来存储被等待线程的返回值(不为NULL时)

函数返回值

成功:0

出错:-1

代码举例

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

/*线程1*/

6.

void

thread1()

7.

{

8.

int

i=0;

9.

10.

while(1)

11.

{

12.

printf(thread1:%d/n,i);

13.

if(i>3)

14.

pthread_exit(0);

15.

i++;

16.

sleep(1);

17.

}

18.

}

19.

20.

/*线程2*/

21.

void

thread2()

22.

{

23.

int

i=0;

24.

25.

while(1)

26.

{

27.

printf(thread2:%d/n,i);

28.

if(i>5)

29.

pthread_exit(0);

30.

i++;

31.

sleep(1);

32.

}

33.

}

34.

35.

int

main()

36.

{

37.

pthread_t

t1,t2;

38.

39.

/*创建线程*/

40.

pthread_create(&t1,NULL,(void

*)thread1,NULL);

41.

pthread_create(&t2,NULL,(void

*)thread2,NULL);

42.

/*等待线程退出*/

43.

pthread_join(t1,NULL);

44.

pthread_join(t2,NULL);

45.

return

0;

46.

}

3同步与互斥

<1>互斥锁

互斥锁的操作主要包括以下几个步骤。

互斥锁初始化:pthread_mutex_init

互斥锁上锁:pthread_mutex_lock

互斥锁判断上锁:pthread_mutex_trylock

互斥锁接锁:pthread_mutex_unlock

消除互斥锁:pthread_mutex_destroy

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

int

i=0;/*共享变量*/

6.

pthread_mutex_t

mutex=PTHREAD_MUTEX_INITIALIZER;/*互斥锁*/

7.

8.

void

thread1()

9.

{

10.

int

ret;

11.

while(1)

12.

{

13.

14.

15.

ret=pthread_mutex_trylock(&mutex);/*判断上锁*/

16.

17.

if(ret!=EBUSY)

18.

{

19.

pthread_mutex_lock(&mutex);/*上锁*/

20.

printf(This

is

thread1:%d/n,i);

21.

i++;

22.

pthread_mutex_unlock(&mutex);/*解锁*/

23.

}

24.

sleep(1);

25.

}

26.

}

27.

28.

void

thread2()

29.

{int

ret;

30.

while(1)

31.

{

32.

33.

ret=pthread_mutex_trylock(&mutex);

34.

if(ret!=EBUSY)

35.

{

36.

pthread_mutex_lock(&mutex);

37.

printf(This

is

thread2:%d/n,i);

38.

i++;

39.

pthread_mutex_unlock(&mutex);

40.

}

41.

sleep(1);

42.

}

43.

}

44.

int

main()

45.

{

46.

pthread_t

t1,t2;

47.

pthread_mutex_init(&mutex,NULL);

48.

pthread_create(&t1,NULL,(void

*)thread1,NULL);

49.

pthread_create(&t2,NULL,(void

*)thread2,NULL);

50.

51.

pthread_join(t1,NULL);

52.

pthread_join(t2,NULL);

53.

54.

pthread_mutex_destroy(&mutex);

55.

return

0;

56.

}

<2>信号量

未进行同步处理的两个线程

1.

#include<pthread.h>

2.

#include<stdio.h>

3.

#include<errno.h>

4.

5.

int

i=0;

6.

void

thread1()

7.

{

8.

9.

while(1)

10.

{

11.

printf(This

is

thread1:%d/n,i);

12.

i++;

13.

sleep(1);

14.

}

15.

}

16.

17.

18.

void

thread2()

19.

{

20.

21.

while(1)

22.

{

23.

printf(This

is

thread2:%d/n,i);

24.

i++;

25.

sleep(1);

26.

}

27.

}

28.

29.

int

main()

30.

{

31.

pthread_t

t1,t2;

32.

33.

pthread_create(&t1,NULL,(void

*)thread1,NULL);

34.

pthread_create(&t2,NULL,(void

*)thread2,NULL);

阅读剩余
THE END