首页 / C++ / c/c++ 多线程入门(二)
c/c++ 多线程入门(二)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c/c++ 多线程入门(二),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2653字,纯文字阅读大概需要4分钟。
内容图文
![c/c++ 多线程入门(二)](/upload/InfoBanner/zyjiaocheng/616/d8fc9a68b03348609daa3e3b5ab71c54.jpg)
先回答上篇文章的问题:
什么原因造成数据混乱?
首先计算靠的是CPU,而CPU的寄存器只能存储极少的数据,时时需要和内存交换。
这时CPU通过内存地址取值的时候,如果是操作的是共享资源(例如:全局变量),且进行多线程操作,如果某个线程的操作完后,还没有马上将数据放回内存,就失去了CPU,那么在其他线程操作这个共享数据的时候,使用的还是旧值,数据自然就发生了混乱。
简单点一句话概括:你操作得太快了,其他人还没拿到最新的值,就去干活了。
如何解决这个问题呢?
最主流的方法就是在操作共享数据前后添加mutex锁(互斥锁)。
互斥锁
作用:
它用于防止多个线程同时访问共享资源。通过一种简单的加锁的方法来控制共享资源的访问,互斥锁只有两种状态,即lock和unlock
特点:
原子性:把一个互斥量锁定为一个原子操作,保证了如果一个线程锁定了一个互斥量,没有其他线程在同一时间可以成功锁定这个互斥量
唯一性:如果一个线程锁定了一个互斥量,在它解除锁定之前,没有其他线程可以锁定这个互斥量
非繁忙等待:如果一个线程已经锁定了一个互斥量,第二个线程又试图去锁定这个互斥量,则第二个线程将被挂起(不占用任何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
内容总结
以上是互联网集市为您收集整理的c/c++ 多线程入门(二)全部内容,希望文章能够帮你解决c/c++ 多线程入门(二)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。