c/c++ 多线程入门(二)

先回答上篇文章的问题:

什么原因造成数据混乱?

首先计算靠的是CPU,而CPU的寄存器只能存储极少的数据,时时需要和内存交换

这时CPU通过内存地址取值的时候,如果是操作的是共享资源(例如:全局变量),且进行多线程操作,如果某个线程的操作完后,还没有马上将数据放回内存,就失去了CPU,那么在其他线程操作这个共享数据的时候,使用的还是旧值,数据自然就发生了混乱

简单点一句话概括:你操作得太快了,其他人还没拿到最新的值,就去干活了

如何解决这个问题呢?

最主流的方法就是在操作共享数据前后添加mutex锁(互斥锁)

互斥锁

作用:

它用于防止多个线程同时访问共享资源。通过一种简单的加锁的方法来控制共享资源的访问,互斥锁只有两种状态,即lockunlock

特点:

原子性:把一个互斥量锁定为一个原子操作,保证了如果一个线程锁定了一个互斥量,没有其他线程在同一时间可以成功锁定这个互斥量
唯一性:如果一个线程锁定了一个互斥量,在它解除锁定之前,没有其他线程可以锁定这个互斥量
非繁忙等待:如果一个线程已经锁定了一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程将被挂起(不占用任何cpu资源),直到第一个线程解除对这个互斥量的锁定为止,第二个线程则被唤醒并继续执行,同时锁定这个互斥量。

pthread_mutex_init

简述:初始化一个互斥锁,只要你调用了,就一定要初始化

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *attr);

pthread_mutex_lock

简述:对互斥锁进行lock,如果对已经上锁的资源进行调用,调用者会一直处于阻塞状态

int pthread_mutex_lock(pthread_mutex_t *mutex);

pthread_mutex_unlock

简述:有lock就有它与lock对应,对互斥锁进行unlock

int pthread_mutex_unlock(pthread_mutex_t *mutex);

pthread_mutex_destroy

简述:用完了锁记得销毁哦~为了释放资源

int pthread_mutex_destroy(pthread_mutex_t *mutex);

这四个足以应付大部分的情况了。

pthread_mutex_trylock

简述:调用该函数时,若互斥锁未加锁,则上锁,返回 0,如果互斥锁已加锁,则函数直接返回失败EBUSY

int pthread_mutex_trylock(pthread_mutex_t *mutex);

改进上篇的代码

#include <stdio.h>   
#include <pthread.h>  
#include <time.h>
#include <windows.h>//使用Sleep的头

int g_number = 0;

#define MAX_COUNT 10000

pthread_mutex_t mut;

void *counter3(void* args) {

	int i = 1;
	while (i <= MAX_COUNT / 4) {
		pthread_mutex_lock(&mut);
		g_number++;
		pthread_mutex_unlock(&mut);
		printf("hi,i am pthread 3, my g_number is [%d]\n", g_number);
		Sleep(1);// 单位ms
		i++;
	}
}

void *counter4(void* args) {
	int j = 1;
	while (j <= MAX_COUNT / 4) {
		pthread_mutex_lock(&mut);
		g_number++;
		pthread_mutex_unlock(&mut);
		printf("hi,i am pthread 4, my g_number is [%d]\n", g_number);
		Sleep(1);
		j++;
	}
}

int main() {
	pthread_mutex_init(&mut, NULL);
	pthread_t t3;
	pthread_t t4;

	pthread_create(&t3, NULL, counter3, NULL);
	pthread_create(&t4, NULL, counter4, NULL);

	pthread_join(t3, NULL);
	pthread_join(t4, NULL);

	return 0;
}

结果

在这里插入图片描述
5000,程序正常!

转载自 https://zhuanlan.zhihu.com/p/97512154

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值