一、实验目的与任务
目的:了解掌握操作系统线程的特点与功能,学会借助Linux线程的功能函数进行编程。
任务:利用C语言指令编写程序调用线程函数,完成相应功能。
二、实验设备
装有Linux操作系统的计算机一台。
三、实验要求
1、通过简单程序编写了解掌握Linux线程编程基本概念、主线程与其它线程以及线程与进程之间的关系。
2、实验安排方式:采用1人1组,上机在Linux系统下进行编程实验。
四、实验内容
1.创建2个线程,线程1输出线程id和自己姓名,线程2输出线程id和自己学号,比较两个线程id是否相等,输出比较的结果
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
//定义线程1运行函数
void* th_fn1(void *arg) //传入void*数值
{
printf("线程1: %lx\n",pthread_self()); //以十六进制输出线程1id
printf("线程1:王雍皓\n");
return (void*)0; //返回指针 数值0
}
//定义线程2运行函数
void* th_fn2(void *arg) //传入void*数值
{
printf("线程2: %lx\n",pthread_self()); //以十六进制输出线程2id
printf("线程2:542113430819\n");
return (void*)0; //返回指针 数值0
}
int main()
{
int err;//定义错误存储
pthread_t tid1,tid2;//定义线程标识符
//创建tid1线程
if((err=pthread_create(&tid1,NULL,
th_fn1,NULL)!=0))
{perror("pthread_create error");}
//创建tid2线程
if((err=pthread_create(&tid2,NULL,
th_fn2,NULL)!=0))
{perror("pthread_create error");}
sleep(1);
//比较大小
if (pthread_equal(tid1,tid2))
{
printf("线程id一致\n");
}
else{
printf("线程id不一致\n");
}
return 0;
}
2.创建2个线程,线程1计算以学号后两位为边长的正方形面积,线程2计算以学号后两位为半径的圆形面积,分别输出计算结果。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
//定义线程1运行函数
void* th_fn1(void *arg) //传入void*数值 a
{
int bianchang=(long)arg;
int v;
v=bianchang*bianchang;
printf("线程1:正方形面积为: %d\n",v);
}
//定义线程2运行函数
void* th_fn2(void *arg) //传入void*数值 r
{
int banjing=(long)arg;
double v;
v=3.14*banjing*banjing;
printf("线程2:圆形面积为: %f\n",v);
}
int main()
{
int err;//定义错误存储
pthread_t tid1,tid2;//定义线程标识符
printf("学号是542113430819\n");
//创建tid1线程
if((err=pthread_create(&tid1,NULL,
th_fn1,(void*)19)!=0))
{perror("pthread_create error");}
//创建tid2线程
if((err=pthread_create(&tid2,NULL,
th_fn2,(void*)19)!=0))
{perror("pthread_create error");}
sleep(1);
return 0;
}
3.创建2个线程,通过利用互斥量加锁分别把正方形面积和圆形面积写入一个字符串数组中,并输出字符串数组的内容。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#define MAX_SIZE 100
double square_area = 0;
double circle_area = 0;
char result[MAX_SIZE] = {0};
pthread_mutex_t mutex;
void *square(void *arg) {
double side = *(double *)arg;
square_area = side * side;
pthread_mutex_lock(&mutex);
sprintf(result, "Square area: %.2f\n", square_area);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void *circle(void *arg) {
double radius = *(double *)arg;
circle_area = 3.14 * radius * radius;
pthread_mutex_lock(&mutex);
sprintf(result + strlen(result), "Circle area: %.2f\n", circle_area);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main() {
pthread_t tid[2];
double side = 19.0;
double radius = 19.0;
pthread_mutex_init(&mutex, NULL);
pthread_create(&tid[0], NULL, square, &side);
pthread_create(&tid[1], NULL, circle, &radius);
for (int i = 0; i < 2; i++) {
pthread_join(tid[i], NULL);
}
printf("%s", result);
pthread_mutex_destroy(&mutex);
return 0;
}