一、实验目的
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中红色框线所示。

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

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

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

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

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