C++ 数据库读写多线程异步锁实现

2021-01-05  本文已影响0人  skkily

要求做一个主线程修改一个数据,子线程异步的读取数据,交给数据库的简单实现

思路

设计两个异步锁

代码实现

#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
using namespace std;
bool flag=false;

pthread_mutex_t mutex_str;//两个互斥锁
pthread_mutex_t mutex_sql;

char str=' ';

void *sql_thread(void* arg){
    while(flag){
        pthread_mutex_lock(&mutex_sql);
        pthread_mutex_lock(&mutex_str);
        sleep(1);//模拟操作
        cout<<"save str:"<<str<<endl;
        pthread_mutex_unlock(&mutex_str);
    }
    pthread_exit(NULL);
}


int main(){
    pthread_mutex_init(&mutex_str,NULL);//锁的初始化,也有静态方式初始化的
    pthread_mutex_init(&mutex_sql,NULL);

    volatile flag=true;//可以利用一个函数修改它停止子线程
    pthread_t sql_t;
    
    pthread_mutex_lock(&mutex_sql);//先锁住,子线程阻塞

    pthread_create(&sql_t,NULL,sql_thread,NULL);//创建子线程

    char i='a';
    while(true){
        i++;
        if(i>'z')
            i='a';
        pthread_mutex_lock(&mutex_str);
        str=i;
        sleep(1);
        cout<<"change str:"<<i<<endl;
        pthread_mutex_unlock(&mutex_str);
        pthread_mutex_unlock(&mutex_sql);
        usleep(1);
        //叫他睡眠一下,不然主线程做不耗时的循环会使得子线程没有机会抢占cpu
        //真实场景下是会有时间给子线程的,问题倒也不打,但模拟场景下现在只能这样了
        //求大佬指点
    }
    return 0;
}

【如果吧两个sleep和usleep去掉也可以看到线程之间的切换动作】

运行结果

上一篇 下一篇

猜你喜欢

热点阅读