记录一种安全的多线程写数据库的方法。
1.写队列线程。
开启任意个线程往队列(QQueue< QByteArray > queue)里写数据,这是线程安全的。
while(reading){
mutex.lock();
if(tcpSocket->waitForReadyRead()){
QByteArray inmsg = tcpSocket->readAll();
queue.push_back(inmsg);
qDebug()<<queue.size();
}
mutex.unlock();
}
2.读队列线程
在这个线程内与数据库建立单个连接,写库(略)。queue.size()>1防止越界。
void SendMySQLthread::run(){
while(sending){
if(!queue.empty()){
if(queue.size()>1){
mutex.lock();
queue.pop_front();
mutex.unlock();
}
}
}
}
3.这种方法速度上与单线程相比没有明显提升,主要是为了获取多客户端的数据。
4.性能:开了6个1ms为间隔发数据的客户端,内存占用10M左右,CPU占用30%左右,原来是个废U的操作。