1 查看源代码
1.1 线程和进程简介:
进程
一个进程包括由操作系统分配的内存空间,包含一个或多个线程。一个线程不能独立的存在,它必须是进程的一部分。一个进程一直运行,直到所有的非守护线程都结束运行后才能结束。
线程
又称其为轻量级进程(Light Weight Process)。是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。他们彼此之间交替执行,称为多线程;
多线程
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。
一个进程(process)含有两个线程(threads)的运行
1.2 安装
Ubuntu默认是没有pthread库的,需要安装。输入命令:
sudo apt-get install -y glibc-doc manpages-posix-dev
sudo apt-get install manpages-posix manpages-posix-dev
2 编译各个程序并在Ubuntu运行;理解并解释运行状态和结果
2.1 线程的创建与终止
创建
- 功能:使用pthread_create()函数创建线程的实例
- 代码:thread_create.c文件
- 编译:
使用命令:gcc thread_create.c -o thread_create -lpthread编译,注意不要忘了加 -lpthread,否则会出现如下的错误
/tmp/ccjfZIN3.o: In function `main':
thread_create.c:(.text+0x8b): undefined reference to `pthread_create'
thread_create.c:(.text+0xc0): undefined reference to `pthread_create'
thread_create.c:(.text+0xeb): undefined reference to `pthread_join'
thread_create.c:(.text+0xfc): undefined reference to `pthread_join'
collect2: ld returned 1 exit status
- 运行:
终止
- 功能:使用pthread_exit()函数退出线程的举例
- 代码:thread_exit.c文件
- 编译:gcc thread_exit.c -o thread_exit -lpthread
- 运行:./thread_exit
2.2 进程的连接
pthread_join()函数功能为等待指定线程结束,其放在主线程中目的是等待子线程结束,主线程再继续运行,其代码如下
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
1.thread为一指定的需要等待运行结束的线程
2.retval为线程的退出码
- 功能:用pthread_join()实现线程等待。
- 代码:thread_join.c文件
- 编译:gcc thread_join.c -o thread_join -lpthread
- 运行:./thread_join
可以看出,pthread_join()等到线程结束后,程序才继续执行。
2.3 使用互斥量保护多线程同时输出
互斥锁
互斥锁是用一种简单的加锁方法来控制对共享资源的原子操作。这个互斥锁只有两种状态,即上锁和解锁,可以把互斥锁看做某种意义上的全局变量。在同一个时刻只能有一个线程掌握某个互斥锁,拥有上锁状态的线程能够对共享资源进行操作。若其他线程希望上锁一个已经被上锁的互斥锁,则该线程就会被挂起,直到上锁的线程释放掉互斥锁为止。可以说,这把互斥锁保证让每个线程对共享资源按顺序进行原子操作。
互斥锁机制主要包括以下基本函数:
● 互斥锁初始化:pthread_mutex_init()
● 互斥锁上锁:pthread_mutex_lock()
● 互斥锁判断上锁:pthread_mutex_trylock()
● 互斥锁解锁:pthread_mutex_unlock()
● 消除互斥锁:pthread_mutex_destroy()
其中,互斥锁可以分为快速互斥锁、递归互斥锁和检错互斥锁。这3种锁的区别主要在于其它未占有互斥锁的线程在希望得到互斥锁时是否需要阻塞等待。快速互斥锁是指调用线程会阻塞直至拥有互斥锁的线程解锁为止;递归互斥锁能够成功地返回,并且增加调用线程在互斥上加锁的次数而检错互斥锁则为快速互斥锁的非阻塞版本,它会立即返回并返回一个错误信息。默认属性为快速互斥锁。
- 编译:gcc thread_mutex.c -o thread_mutex -lpthread
- 运行:./thread_mutex
2.4 条件变量使用
条件变量用来阻塞一个线程,直到其他的线程通知它条件已经满足为止。
- 编译:
gcc -o Untitled-5.out Untitled-5.c -lpthread -lm
./Untitled-5.out
- 运行:
3 运行开发板
3.1 下载、安装、运行QEMU
下载
- 下载成功后,进入ubuntu-18.04_imx6ul_qemu_system目录,执行install_sdl.sh
- 在Ubuntu 18.04系统中,执行如下命令,可以得到一个目录ubuntu-18.04_imx6ul_qemu_system:
$ git clone https://e.coding.net/weidongshan/ubuntu-18.04_imx6ul_qemu_system.git
安装
- 下载成功后,进入
ubuntu-18.04_imx6ul_qemu_system
目录,执行install_sdl.sh
如下所示:$ cd /home/suliu/Desktop/ubuntu-18.04_imx6ul_qemu_system/ $ ls imx6ull-system-image qemu-imx6ull-gui_test.sh source install_sdl.sh qemu-imx6ull-nogui.sh ubuntu-18.04_sdl-package qemu README.md qemu-imx6ull-gui.sh rootfs_test $ install_sdl.sh
运行QEMU
- 必须在Ubunut的桌面环境下启动终端,执行
./qemu-imx6ull-gui.sh
如下所示:
参考
Linux多线程编程(一)---多线程基本编程_玖零大壮的博客-CSDN博客_linux 多线程
linux 多线程_进程_开发板_dfjkhksc的博客-CSDN博客
【嵌入式Linux】线程与进程_sl……的博客-CSDN博客
感谢!