要求做一个主线程修改一个数据,子线程异步的读取数据,交给数据库的简单实现
思路
设计两个异步锁
- [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去掉也可以看到线程之间的切换动作】
网友评论