北京科技大学实验报告
学院:自动化学院专业:班级:
姓名:学号:实验日期:2018年5月7日
实验名称:实验六嵌入式Linux多线程编程实验
实验目的:
1.掌握线程的运行机制、创建方法及特点。
2.掌握线程退出、线程等待、线程清除等函数的使用方法。
3.学会线程的数据处理方法。
实验仪器:linux操作系统64位
实验内容与步骤:
编写程序,完成如下五个功能,要求写出编程思路、实验步骤,显示程序运行结果,并进行必要的分析。
1)有一个int型全局变量g_Flag初始值为0;
2)在主线程中起动线程1,打印“this is thread1”,并将g_Flag设置为1;
3)在主线程中启动线程2,打印“this is thread2”,并将g_Flag设置为2;
4)线程1需要在线程2退出后才能退出;
5)主线程在检测到g_Flag从1变为2,或者从2变为1的时候退出。
实验数据:
编程思路:
本实验我是主要是用到进程与线程相关的概念,有关线程操作的函数,线程之间的互斥以及线程之间的同步这些内容,在编写程序代码时,首先定义一个int型全局标志g_Flag,设置其初始值大小为0,初始化进程锁pthread_mutex_t mutex,然后初始化条件变量pthread_cond_t cond,声明两个线程函数,分别为thread1和thread2,定义两个线程id分别为tid1和tid2,创建线程,如果线程创建成功的话就返回0,否则的话就返回一个正数,如果rc2不等于0的话,说明创建错误,在线程1程序入口,启动进程thread1,输出enter thread,执行进程1打印出this is thread1,g_Flag的值也同时输出,输出结果
为1,得到当前线程id,接下来如启动进程互斥锁,如果g_Flag的值为2则说明线程thread2已经执行了,这时候进程2打印出this is thread2,g_Flag的值为2,首先退出进程2,然后再退出进程1,通过调用pthread_exit()函数实现进程的退出,当g_Flag的值发生变化,当其从1变为2或者从2变为1时,主线程能够检测到g_Flag发生的变化,调用pthread_exit()函数退出主线程。
实验程序:
#include <stdio.h>
#include <error.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
int flag=0;
void *thread1(void*);
void *thread2(void*);
static pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t cond=PTHREAD_COND_INITIALIZER;
int main()
{
linux在线编程printf("enter main\n");
pthread_t tid1,tid2;
int ret=0;
if((ret=pthread_create(&tid1,NULL,thread1,&tid2))!=0)
printf("create thread1 error!\n");
if((ret=pthread_create(&tid2,NULL,thread2,NULL))!=0)
printf("create thread2 error!\n");
pthread_cond_wait(&cond,&mutex);
printf("leave main\n");
return 0;
}
void *thread1(void *argc){
printf("this is thread1\n");
pthread_mutex_lock(&mutex);
if(flag==2)
pthread_cond_signal(&cond);
flag=1;
pthread_mutex_unlock(&mutex);
pthread_join(*(pthread_t*)argc,NULL);
pthread_exit(0);}
void *thread2(void *argc){
printf("this is thread2\n");
pthread_mutex_lock(&mutex);
if(flag==1)
pthread_cond_signal(&cond);
flag=2;
pthread_mutex_unlock(&mutex);
pthread_exit(0);
}
实验结果与分析:
通过本次实验,我掌握了线程的运行机制,创建方法,线程退出,线程清除等函数的使用,以及使用线程处理数据,通过编写程序,调试运行,线程与进程相比具有很多优势,和进程相比,线程是一种非常节俭的多任务操作方式,线程之间具有方便的通信机制,使多CPU系统更加有效,改善程序结构。
本次实验所遇到的问题主要有两个,一个是对线程程序的编写,线程创建,线程退出,线程等待,线程清除等函数的组合使用,还有互斥锁的应用,经过多次编写,修改和调试后才得出实验的结果,另一个问题是在编译编写的c文件时,总是出错,总是显示下图所示的错误,总是显示对pthread_create未定义的引用
后来想起了老师在课堂上讲述的线程程序编译规则,由于pthread的库不是linux 系统的库,在编译时要加入-lpthread,这样编译之后就能够成功编译和运行。
总的来说本次的实验收获还是很大的,但是对实验程序的一些细节部分,我还不是太懂,还有一些函数的使用,在接下里的学习生活中,我会继续加强对多线程编程内容的学习,更好地掌握这种操作方式的使用。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论