Thread实验
实验目的
- 熟悉 Linux 应用程序编程;
- 掌握 Linux 多线程程序编写。
实验设备
实 验 设 备 | 数 量 | 备 注 |
---|---|---|
感知 RF2-210 实验箱 | 1 | 运行 linux 程序 |
串口线 | 1 | 连接网关板 COM3 与 PC 串口 |
PC 机 | 1 | 编译和下载程序 |
实验内容
创建两个线程,各自统计发生次数,主程序监测两个线程的返回值。
实验原理
线程是一种标准化模型,它用于把一个程序分成一组能够同时执行的任务。 线程是一种特殊的进程,常称之为轻量级进程(light-weight process)。一个进程的 所有线程有独立的执行线索和堆栈,但共享数据。
使用多线程的应用程序,必须包含pthread.h 文件,同时在链接程序的时候 加上-lpthread 参数。
线程的属性
joinable
具有joinable属性的线程在执行完毕后并不会立即被Linux清除,如果函数有返回值,其返回值可通过pthread_join()函数调用得到。
detatched
具有 detatched 属性的线程,执行完毕立即被Linux 清除,无法通过 pthread_join()函数调用获得其返回值。
建立线程的的时候如果没有指定属性,默认为 joinable 属性。
创建线程创建线程使用 pthread_create()函数实现。函数原型:
int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine) (void *), void *arg)
包含 4 个参数:
thread_id―― 指向新线程标识的指针。
attr―― 决定新线程的属性。设置为 PTHREAD_CREATE_JOINABLE 或者 NULL表示线程具有joinable 属性,设置为 PTHREAD_CREATE_DETATCHED 表示线程具有detatched属性。
*start_routine――指向新线程中将要执行的函数的指针。
arg――传递给新线程函数的参数。
挂起线程
挂起线程使用 pthread_join()函数实现。函数原型:
int pthread_join(pthread_t th, void **thread_return) pthread_join()
调用挂起当前线程,直到 th 指定的线程终止运行为止。
如果线程有返回值,返回值保存在 thread_return 指向的地址中。一个线程 所使用的内存资源在对该线程应用pthread_join()调用之前不会被重新分配。
实验步骤
1.进入虚拟机ubuntu系统下,打开终端调试软件进入“/opt/WXL/Basic”实验操作目录
输入以下命令进入“/opt/WXL/Basic”目录
#cd /opt/WXL/Basic
2.编译实验代码
2.1 输入以下命令新建thread文件夹
# mkdir thread
2.2 进入thread实验目录
输入以下命令新建thread.c文件并填写内容
# touch thread.c
输入命令新建Makefile文件并填写内容
# touch Makefile
2.3 编译生成可执行文件
输入命令如下进行编译
# make
编译完成后在/opt/WXL/Basic/thread 目录下生成了可执行目标文件 thread。
3.下载到目标板执行
将生成的可执行文件“thread”拷贝到Windows目录下,通过超级终端使用串口下载到感知RF2-210实验箱目标板上运行。
3.1拷贝可执行文件到Windows;
3.2通过超级终端发送文件到感知RF2-210;
3.3修改可执行文件的权限和执行
修改权限输入命令:
#chmod 775 thread
3.4执行程序命令:
# ./thread
附录
thread.c文件
#include
#include
#include
#include
#include
int task1(int *cnt)
{
while(*cnt < 5) {
sleep(1);
(*cnt)++;
printf("task1 cnt = %d.\n", *cnt);
}
return (*cnt);
}
int task2(int *cnt) {
while(*cnt < 5) {
sleep(2);
(*cnt)++;
printf("task2 cnt = %d.\n", *cnt);
}
return (*cnt);
}
int main(int argc, char **argv) {
int result;
int t1 = 0;
int t2 = 0;
int rt1, rt2;
pthread_t thread1,
thread2;
/* create the first thread. */
result = pthread_create(&thread1, PTHREAD_CREATE_JOINABLE, (void *)task1, (void *)&t1);
if(result) {
perror("pthread_create: task1.\n");
exit(EXIT_FAILURE);
}
/* create the second thread. */
result = pthread_create(&thread2, PTHREAD_CREATE_JOINABLE, (void *)task2, (void *)&t2);
if(result){
perror("pthread_create: task2.\n");
exit(EXIT_FAILURE);
}
pthread_join(thread1, (void *)&rt1); pthread_join(thread2, (void *)&rt2);
printf("total %d times.\n", t1+t2);
printf("return value of task1: %d.\n", rt1);
printf("return value of task2: %d.\n", rt2);
exit(EXIT_SUCCESS);
}
Makefile文件
EXEC = thread
OBJS = thread.o
SRC = thread.c
CC = arm-linux-gcc
#LD = arm-linux-ld
CFLAGS += -O2 -Wall
LDFLAGS += -lpthread
all:$(EXEC)
$(EXEC):$(OBJS)
$(CC) $(CFLAGS) -c $@ $(OBJS)
%.o:%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
@rm -vf $(EXEC) *.o*-