并发下的计数方案(锁)
项目目的:了解并发,了解技术方案
项目知识点:互斥锁、自旋锁、原子操作
推荐书籍:unix高级环境编程
课后练习题:了解CAS,并实现CAS
1、了解并发,了解技术方案
究竟什么样的系统算是高并发系统?今天,我们就一起解密高并发业务场景下典型的秒杀系统的架构,让大家学以致用。
你需要了解的秒杀方案
2、void *p()是一个指针型函数,它的函数名为p,返回了一个指针,因为是void,这个指针没有定义类型,所以返回的是一个通用型指针。
3、互斥锁、自旋锁、原子操作
基本操作:锁初始化,上锁——操作——解锁
linux线程互斥量pthread_mutex_t使用简介
01Linux下C语言锁的学习之Linux下的互斥锁
4、了解CAS,怎么实现CAS
面试|详解CAS及其引发的三个问题
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
//表示10个线程
#define THREAD_COUNT 10
pthread_mutex_t mutex;//互斥锁
pthread_spinlock_t spinlock;//自旋锁
//汇编语句
int inc(int *value,int add){
int old;
__asm__ volatile(
"lock; xaddl %2, %1;"
:"=a"(old)
:"m"(*value),"a"(add)
:"cc","memory"
);
return old;
}
void *thread_callback(void *arg) {
int *pcount = (int*)arg;
int i = 0;
while(i++ < 1000000){
#if 0//没加锁
(*pcount)++;
#elif 0//互斥锁操作
pthread_mutex_lock(&mutex);
(*pcount)++;
pthread_mutex_unlock(&mutex);
#elif 0//自旋锁操作
pthread_spin_lock(&spinlock);
(*pcount)++;
pthread_spin_unlock(&spinlock);
#else//原子操作
inc(pcount,1);
#endif
usleep(1);//每买一次休眠以
}
}
int main(){
pthread_t threadid[THREAD_COUNT] = {0};
pthread_mutex_init(&mutex,NULL);//互斥锁线程初始化
pthread_spin_init(&spinlock,PTHREAD_PROCESS_SHARED);//自旋锁线程初始化
//模拟十个窗口
int i = 0;
int count = 0;
for (i = 0;i < THREAD_COUNT; i++) {
pthread_create(&threadid[i],NULL,thread_callback,&count);
//每一个秒刷新一次
for(i=0;i<100;i++){
printf("count:%d\n",count);
sleep(1);
}
}
}