嵌入式与Linux(五):Linux线程

嵌入式与Linux(五):Linux线程,第1张

姓名:王央京    学号:18050100052   学院:电子工程学院

转自:https://blog.csdn.net/qq_22847457/article/details/89371217

【嵌牛导读】本文介绍了Linux线程的相关信息

【嵌牛鼻子】Linux线程

【嵌牛提问】在了解Linux系统后,能否具体介绍线程的概念?

【嵌牛正文】

类Unix系统中,早期是没有“线程”概念的,80年代才引入,借助进程机制实现出了线程的概念。因此在这类系统中,进程和线程关系密切。一个进程可以有多个线程,这个进程本身也叫做线程只不过是主线程。通常主线程分配任务给子线程做。程序设计时候就可以某一时刻不止做一件事情,每一个线程处理各自独立的任务。

多个线程可以访问相同的存储地址空间和文件描述符。同一进程内的线程共享以下数据:全局内存、进程指令、打开的文件、信号处理函数和信号处置、当前工作目录、用户ID和用户组ID、大多数数据。每个线程有各自的线程ID、寄存器集合(包括程序计数器和栈指针)、栈、errono、信号掩码、优先级。

线程的优点有提高程序并发性、开销小和数据通信、共享数据方便等。线程的缺点有库函数不稳定、调试编写困难、gdb不支持、对信号支持不好等。除此之外,多线程内如果其中一个线程出现了 除0、野指针 等问题会造成该线程崩溃,进而导致整个进程终止。同时,线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出。

从上述分析来看,线程的优点相对突出,缺点均不是硬伤。Linux下由于实现方法导致进程、线程差别不是很大。

线程有一套完整的与其有关的函数库调用,它们中的绝大多数函数名都以pthread_开头。为了使用这些函数库调用,我们必须定义宏_REENTRANT,在程序中包含头文件pthread.h,并且在编译程序时需要用选项-lpthread来链接线程库。其中常用的函数库如下:

1.  pthread_self函数获取线程ID,其作用对应进程中getpid()函数。

2.  pthread_create函数创建一个新线程,其作用对应进程中fork()函数。

3.  pthread_exit函数将单个线程退出,其作用对应进程中exit()函数

4.  pthread_join函数阻塞等待线程退出,获取线程退出状态其作用,对应进程中waitpid()函数。

5.  pthread_cancel函数杀死(取消)线程其作用,对应进程中kill()函数。

6.  pthread_detach函数实现线程分离。

1)

linux二进制可执行文件是无法得转换为代码的,所以修改不了代码,只能找源码去改,改完了重新交叉编译再写进开发板上。

2)

使用linux多线程问题,A中满足条件创建线程B,线程B中满足条件创建线程C,如果你线程A和B没有退出,A和B都会继续执行

实例程序如下:main中十秒后创建线程A ,A中10秒后创建B,B线程十秒后创建线程C,每个线程中都会有打印信息,当出现pthread A pthread B pthread C同时出现时,证明三个线程同时存活

此程序编译时需加-phread参数,例如:cc pthread_join.c -pthread

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <pthread.h>

void * A()//线程函数声明

void * B()

void * C()

void * A()

{

pthread_t b

int i = 0

while(i <50)

{

if (++i == 10)

pthread_create(&b, NULL, (void *)B, NULL )//创建线程B

sleep(1)

printf("pthread A\n")

}

pthread_join(b, NULL)

return 0

}

void * B()

{

pthread_t c

int i = 0

while(i <30)

{

if (++i == 10)

pthread_create(&c, NULL, (void *)C, NULL )//创建线程C

printf("pthread B\n")

sleep(1)

}

pthread_join(c, NULL)

return 0

}

void *C()

{

int i = 0

while(i <10)//C线程执行10秒后退出,资源在B线程中pthread_join函数回收

{

printf("pthread C\n")

sleep(1)

i++

}

return 0

}

int main()

{

pthread_t a

int i = 0

while(i <100)

{

if (++i == 10)

pthread_create(&a, NULL, (void *)A, NULL )//创建线程A

printf("i = %d\n", i )

sleep(1)

}

pthread_join(a, NULL)

return 0

}

以上是多线程程序的例子

但是,如果你想一个程序调用另一个程序时,你可以这样做:

比如你有三个可执行程序a.out b.out c.out

运行a.out当符合某个程序时使用system("./b.out")调用程序b.out,在b.out程序中以同样的方法调用程序c.out。但此时已经不是多线程了,而是三个不同的进程,进程a.out b.out 和c.out

也可以在上面的程序中十秒的时候创建子进程后,在子进程中以system("./b.out")来运行程序b.out

解决方法如下:

这个问题是由于访问内存错误造成的,例如一次时因为循环越界,导致访问界外内存时出现过此种问题。

2、程序卡死的问题,就是程序的进程还在,但是却卡在那里什么都不做,该问题可能也是内存访问越界造成的;

另外还可能是多线程中混合使用C和C++的函数造成,例如:某些嵌入式linux平台对C++支持的不好,这时候如果在多线程中混合使用printf和cout,就会造成此问题。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8675610.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存