记录一些c多线程编程代码

代码来源与b站的一个up主 https://www.bilibili.com/video/av39377772/?p=4

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

/*
* 初始化5000个随机数,然后用两个线程求和
*/

typedef struct{
	int first;     //开始指针
	int last;	   //结束指针
	int result;    //保存结果
} MY_ARGS;

int arr[5000];
int s1=0;
int s2=0;

void* myfunc(void* args){
	int i;
	int s=0;
	MY_ARGS *my_args=(MY_ARGS*)args;    //将参数转换成结构体的类型
	int first = my_args->first;
	int last = my_args->last;
	for(i=first; i<last; i++){
		s = s + arr[i];
	}
	my_args->result = s;
	return NULL;
}

int main(){
	int i;
	for(i=0; i<5000; i++){
		arr[i] = rand() % 50;            //初始化5000个随机数
	}
	pthread_t th1;
	pthread_t th2;

	MY_ARGS args1 = {0, 2500, 0};
	MY_ARGS args2 = {2500, 5000, 0};

	pthread_create(&th1, NULL, myfunc, &args1);
	pthread_create(&th2, NULL, myfunc, &args2);
	
	pthread_join(th1, NULL);
	pthread_join(th2, NULL);
	
	int s1 = args1.result;
	int s2 = args2.result;
	printf("s1=%d\n", s1);
	printf("s2=%d\n", s2);
	printf("s1+s2=%d\n", s1+s2);
	return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

/*
*这个程序展示mutex锁的用法
*/
int s=0;
pthread_mutex_t lock;

void* myfunc(void* args){
	int i=0;
	for(i=0; i<100000; i++){
		pthread_mutex_lock(&lock);
		s++;
		pthread_mutex_unlock(&lock);
	}
	return NULL;
}

int main(){
	pthread_t th1;
	pthread_t th2;
	
	pthread_mutex_init(&lock, NULL);
	
	pthread_create(&th1, NULL, myfunc, NULL);
	pthread_create(&th2, NULL, myfunc, NULL);
	
	pthread_join(th1, NULL);
	pthread_join(th2, NULL);
	
	printf("s=%d", s);
	return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_SIZE 5000
/*
* 这个程序介绍的是假共享 False sharing
* 如果把结果数组变成全局变量,
* 那么会比把结果写在各个线程里更慢一点
*/

typedef struct{
	int first;
	int last;
	int id;
}MY_ARGS;

int* arr;
int results[2];

void* myfunc(void* args){
	int i;
	MY_ARGS* my_args=(MY_ARGS*) args;
	int first = my_args->first;
	int last = my_args->last;
	int id = my_args->id;
	for(i=first; i<last; i++){
		results[id] = results[id]+arr[i];
	}
	return NULL;
}
int main(){
	int i;
	arr = malloc(sizeof(int)*MAX_SIZE);
	for(i=0; i<MAX_SIZE; i++){
		arr[i] = rand() % 5;
	}
	results[0] = 0;
	results[1] = 0;
	
	pthread_t th1;
	pthread_t th2;
	
	int mid=MAX_SIZE/2;
	MY_ARGS args1={0, mid, 0};
	MY_ARGS args2={mid, MAX_SIZE, 1};
	
	pthread_create(&th1, NULL, myfunc, &args1);
	pthread_create(&th2, NULL, myfunc, &args2);
	
	pthread_join(th1, NULL);
	pthread_join(th2, NULL);
	
	printf("s1=%d\n", results[0]);
	printf("s2=%d\n", results[1]);
	printf("s1+s2=%d\n", results[0]+results[1]);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值