实验六 Linux线程编程

一、实验目的与任务

目的:了解掌握操作系统线程的特点与功能,学会借助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;
}

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值