美文网首页
C++ 数据库读写多线程异步锁实现

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

作者: skkily | 来源:发表于2021-01-05 15:50 被阅读0次

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

    思路

    设计两个异步锁

    • [mutex_str]用来保护要读写的内容
    • [mutex_sql]用来表示此内容已经被主线程修改过,如果未修改内容则子进程阻塞

    代码实现

    #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去掉也可以看到线程之间的切换动作】

    运行结果

    相关文章

      网友评论

          本文标题:C++ 数据库读写多线程异步锁实现

          本文链接:https://www.haomeiwen.com/subject/zvqwoktx.html