首页 > 系统相关 >c语言——【linux】多线程编程 (内附练习及代码)

c语言——【linux】多线程编程 (内附练习及代码)

时间:2025-01-13 20:59:03浏览次数:3  
标签:typedef include struct int 内附 void linux 多线程 data

1:开启一个线程

主线程中:使用标准IO,向一个文件中写入任意数据

分支线程:使用标准IO,读取该文件中的数据

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;

void task1(){
	
	FILE* fp=fopen("demo1.txt","w");

	fprintf(fp,"hello");
	fflush(fp);
	fclose(fp);
}

void task2(){
	
	FILE* fp=fopen("demo1.txt","r");
	char buffer[256]="";
	fscanf(fp,"%s",buffer);
	printf("read:%s \n",buffer);
	
	fclose(fp);
}

void* thread_main(void* arg)
{
	task2();
	return NULL;
}

int main(int argc, const char *argv[])
{
	pthread_t id;
	//主线完成写入
	task1();
	//创建分支线程读取任务
	pthread_create(&id,0,thread_main,0);
	//等待支线完成
	pthread_join(id,NULL);

	return 0;
}

2:创建2子个进程   使用文件IO去实现
    父进程负责:向文件中写入数据
    2个子进程负责:从文件中读取数据
    要求:一定保证1号子进程先读取,2号子进程后读取
   

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;

void write_to_file(const char*filename)
{
	int fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0644);
	const char* data="hello world\n";
	ssize_t byte_written=write(fd,data,strlen(data));
	printf("父进程写入数据\n");
	close(fd);
}

void read_from(const char* filename,int process_id)
{
	int fd =open (filename,O_RDONLY);
	char buffer[256];
	ssize_t byte_read= read(fd,buffer,sizeof(buffer)-1);
	printf("子进程%d 读取:%s\n",process_id,buffer);
	close(fd);
}


int main(int argc, const char *argv[])
{
	const char* filename="demo2.txt";
	write_to_file(filename);

	//创建子进程1
	pid_t pid1=fork();
	if(pid1==0)
	{
		read_from(filename,1);
		exit(0);
	}
//父进程等待  子进程1完成
	waitpid(pid1,NULL,0);

	//创建 子进程2
	pid_t pid2=fork();
	if (pid2==0)
	{
		read_from(filename,2);
		exit(0);
	}
	//父进程 等子进程2完成
		waitpid(pid2,NULL,0);

	printf("全部完成\n");


	return 0;
}


3:创建一个线程(1个主线程和一个分支线程)
    主线程负责:输入三角形的三条变长
    分支线程负责:计算三角形的面积(自己百度海伦公式) 海伦公式里面要用到开平方 sqrt函数,使用sqrt函数编译的时候需要在编译的最后加上 -lm
    这里随便怎么整,一定保证先输入数据,再计算面积 

#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
#include <math.h>

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;

typedef struct {
	int a,b,c;
}Triangledata;

//输入三边长
void task1(Triangledata *data)
{
	printf("输入三边长:\n");
	scanf("%d %d %d",&data->a,&data->b,&data->c);
}

//计算面积
void task2(Triangledata *data)
{
	int a=data->a,b=data->b,c=data->c;

	if(a+b>c &&a+c>b &&b+c>a)
	{
		double s=(a+b+c)/2.0;
		double area=sqrt(s*(s-a)*(s-b)*(s-c));
		printf("面积是%lf\n",area);
	}else
	{
		printf("不能构成三角形\n");
	}
}
//分支入口函数
void *thread_main(void* arg)
{
	Triangledata *data=(Triangledata*)arg;
	task2(data);
	return NULL;
}


int main(int argc, const char *argv[])
{
	pthread_t id;
	Triangledata data;

	//主线输入三边长
	task1(&data);
	//创建支线计算面积
	pthread_create(&id,0,thread_main,&data);
	//等支线完成
	pthread_join(id,NULL);
	
	return 0;
}

标签:typedef,include,struct,int,内附,void,linux,多线程,data
From: https://blog.csdn.net/weixin_56261190/article/details/145121827

相关文章

  • Linux操作命令之网络管理
    一、网络基础命令1、查看网络信息[root@controller~]#ipaddrshow1:lo:<LOOPBACK,UP,LOWER_UP>mtu65536qdiscnoqueuestateUNKNOWNgroupdefaultqlen1000link/loopback00:00:00:00:00:00brd00:00:00:00:00:00inet127.0.0.1/8scopehostlo......
  • 多线程的实现
    1.线程和进程的概述1.1什么是进程?正在执行的程序,称为进程。进程是系统分配资源的单元。现在系统支持多进程的。1.2什么是线程?线程,又称轻量级进程(LightWeightProcess)。线程是进程中的一条执行路径,也是CPU的基本调度单位。若一个程序可同一时间执行多个线程,就是支......
  • Linux基础
    Linux常见命令:    ls命令:        ls功能:查看当前目录下的所有文件            蓝色文件:目录文件(文件夹)             白色文件:普通文件(文本文件)        ls-a功能:查看当前目录......
  • 进程、线程,java如何实现多线程任务,Thread里面常用的方法
    1.线程和进程的概述1.1什么是进程正在执行的程序,称为进程。进程是系统分配资源的单元。1.2什么是线程线程又称轻量级的进程,是CPU调度的基本单位,一个进程由一个或多个线程组成进程与进程之间无法共享数据同一个进程的线程与线程之间可以共享数据2.并发与并行的概述并......
  • linux服务器: Shell文件,注释,变量
    Shell文件Shell是一个用户跟操作系统之间的一个命令解释器创建shell文件编写内容#!/bin/bash:这是一个shebang行,告诉系统这个脚本应该使用bashshell来执行。#是一个注释字符,用于说明这行的作用。echo命令,用于在终端输出文本执行脚本1.给文件执行......
  • 嵌入式Linux SPI子系统驱动 通信协议原理 硬件 时序 深度剖析
    SPI(SerialPeripheralInterface,串行外设接口)是一种同步的串行通信协议,通常用于微控制器和外部设备(如传感器、存储器、显示屏等)之间的高速数据传输。SPI协议由主设备(Master)和从设备(Slave)组成,主设备发起通信并控制时序,而从设备根据主设备的指令进行响应。SPI使用4根信号线进行......
  • 【Linux】Linux常见指令(下)
    个人主页~Linux常见命令(上)~初识Linux一、Linux基本命令11、cat命令12、more指令13、less指令14、head指令15、tail指令16、时间相关的指令(1)date指令(2)cal指令17、find指令18、grep指令19、压缩相关指令(1)zip、unzip指令(2)tar指令20、bc指令一、Linux基本命令i=1......
  • linux常用命令(2)[常用快捷键, clear, date, ping, ps, kill, man, help, info ]
    常用快捷键清空命令行界面  clear示例显示时间 datedate和date-R命令的区别如下"CST"表示"ChinaStandardTime",即中国标准时间中国标准时间是协调世界时(UTC)的东八区时间,也就是UTC+8:00网络测试命令  ping用于测试主机之间网络的连通性上面的截图......
  • windows消息循环和linux消息循环的异同
     一、消息循环的基本概念消息循环(MessageLoop)是一种编程结构,用于等待和分派消息。在不同的系统或机制下,消息循环有不同的称呼,如事件循环(EventLoop)或运行循环(RunLoop)。它是经典的消息驱动机制的基础‌。 二、相同点事件驱动机制的核心地位在Linux和Windows中......
  • Qt多线程开发全解析
     目录一、引言二、Qt多线程基础概念2.1线程与进程2.2Qt中的线程类三、Qt多线程的使用场景3.1耗时操作处理3.2实时数据处理3.3多任务并发执行四、Qt多线程的实现方式4.1继承QThread类4.2使用QThreadPool线程池4.3利用QtConcurrent框架五、线程间的同步......