• 2025年8月19日 星期二

H30528D-实验五-线程创建与并发

5 月 29, 2023

一、实验目的

1. 了解Linux的ULT(用户级线程)机制。

2. 学会创建线程的编程方法。

3. 加深理解进程数据的多线程共享概念。

二、实验内容

实验5.1  创建线程

实验5.2  多线程间共享数据

三、实验主要步骤

实验5.1  创建线程

①用你的用户账号登录,并进入ostest目录。

 ②完成源程序test5_1.c的设计与编辑

 /*test5_1.c :创建线程*/

 #include<stdio.h>

 #include<pthread.h>

   #include<stdlib.h>

 int data=4;

 void *thereadcode()  /*线程的执行代码*/

 {

   printf(“theread: data=%d\n”,++data);

   pthread_exit(0);  /*线程正常终止*/

 }

int main()

 {

   pthread_t  tid;  /*声明tid为线程标识号类型*/

   printf(“data=%d\n”,++data);

   <创建线程thereadcode>

   if(<创建失败>){

       printf(“create of theread is fail\n”);

       exit(-1);   /*非正常终止*/

           }

   <等待线程的终止>

   printf(“data=%d\n”,++data);

   return 0;

 }

 ③用gcc编译test5_1.c

   由于头文件pthread.h实际上不是Linux默认的库,故在gcc命令行中需要使用选项“-l”链接该库,如:

      gcc  –o  test5_1  –l  pthread  test5_1.c

 ④运行test5_1观察输出结果。

 ⑤修改test5_1.c,将语句“int data=4;”移到main函数内的首部。观察运行结果。

实验5.2  多线程间共享数据

设计一个售票模拟系统进程,在其main函数中创建2个售票终端线程,这2个线程共享进程的全局数据——余票数据库ticket和余票数rest。

   下面给出部分程序,请设计出其余部分,并完成编辑、编译及调试运行。

 /*test5_2.c :售票模拟系统*/

 #include<stdio.h>

 #include<pthread.h>

 int ticket[10]={1,3,5,7,9,2,4,6,8,10};

 int rest=10;

void *terminal(void *num)  /*终端线程共享代码*/

 { int  tn= (int *)num; /*num所指单元里存放的是终端线程编号*/

  int  tot=0;  long  i ;

  while()

     if(rest>0)

     {rest–;

          printf(“Terminal_%d:sell a ticket, num=%d\n”, tn,

                               ticket[rest]);

               tot++;

          for(i=0; i<999999; i++);

       }

      else break; 

   printf(“Selled %d tickets from terminal_%d\n”, tot, tn);

   pthread_exit(0);  

  }

 int main()

 { pthread_t  tid; 

  int  num=1; /*num为终端线程编号*/

  <创建售票终端线程1和售票终端线程2 >

  <等待线程的终止>

       printf(“Over!\n”);

  return 0;  

  }

  多次运行程序,观察运行结果。

  结果都正确吗?有什么问题?能解决吗?

 

四、实验结果测试

1.修改补充test5_1.c的代码,需要修改的内容如图1中红色框线所示。

图1

2.完成后,使用gcc test5_1.c -l pthread -o test5_1.out编译该代码文件,并运行test5_1.out文件,输出结果如图2所示。

图2

3.尝试将int data=4;命令移到main函数的首部,如图3所示。

图3

4.再次使用第2步的命令编译,发现编译出错,原因是变量声明不明确,结果如图4所示。

图4

5.对于公交售票系统,代码如图5所示。

图5

6.使用第2步的命令编译并多次运行,结果如图6所示。

图6

附件下载

Avatar photo

李星海

简介: 2025-今 浙江农林大学 | 2022-今 广州白蓝碗蛋科技有限公司 | 2022-2024 广州商学院 | 2019-2022 广东工贸职业技术学院 | 服务宗旨:心始至客,行亦致远。