搜索
aardio官方社区 门户 查看主题

请教一个关于多线程的问题

发布者: sunshuyan | 发布时间: 2018-4-16 20:27| 查看数: 934| 评论数: 7|帖子模式

请教一个关于多线程的问题
代码量太大,这里缩减代码,只描述思路:

线程1 = thread.create(
        function( v1 ){
                //对sqlite数据库进行读写操作
        },winform
)

线程2 = thread.create(
        function( v1 ){
                //对sqlite数据库进行读写操作
        },winform
)

同时执行 线程1 和 线程2,这时候sqlite会因为锁定出错。应该是不能同时对数据库表写入。
请问这个问题如何解决?或者应该学习那些知识? 我在论坛里没有搜索到相关问题,所以不知如何下手。
请大家给我提供一个解决思路,或者学习内容即可。

最新评论

我心飞翔1995 发表于 2018-4-16 21:08:05
看上去,这个应该是sqlite的问题,不是aardio方面的问题。
关于SQLite多线程的问题可以参考这个:SQLite在多线程环境下的应用 - CSDN博客
https://blog.csdn.net/diyagoanyhacker/article/details/7209888
和sqlite官方的解释。
xauto 发表于 2018-4-16 21:14:26
论坛里搜不到,那是因为没人傻到明知道不能同时操作数据库,还要去写!
我觉得你应该学习 c , 数据库知识 然后自己实现一个可以同时写入的数据库。
sunshuyan 发表于 2018-4-16 21:28:01
我要的不是一定要 “同时写入数据库”。我知道同时不能写入
我想知道如何才能不让两个线程不冲突,比如遇到数据库写入时,让另外一个线程等待下,或者其他的排队的办法。
我想大概有这样的方法吧
Jacen.He 发表于 2018-4-16 22:07:59
sunshuyan 发表于 2018-4-16 21:28
我要的不是一定要 “同时写入数据库”。我知道同时不能写入
我想知道如何才能不让两个线程不冲突,比如遇 ...
这属于多线程的基础知识了,
这教程、文档、范例里都有的,简单的用thread.lock 就可以了。

即使是sqlite,库函数文档里对多线程同步也是有说明的,
文档里写明了sqlite可以同时读,不可以同时写,如果出现锁冲突的话,aardio也提供了 busyHandler控制重试次数,或者 busyTimeout 控制重试时间。

而且sqlite的问题 sqlite里解决,aardio只是提供了一个接口,
sqlite这方面的资料也是非常多的。绝对不可能真的是:搜索不到,不知如何下手。
答案基本上都是准备好了,只等你伸手拿一下了。

我们论坛这个问题特别严重,很多帖子都喜欢强调我找不到,我不知道从那下手..........我动都没办法动。要不就是我搞了多少个通宵,多么痛苦。但是最简单的发个可运行的代码都不愿意,这是举手之劳的事情,例如楼主这个问题,真的是你比我还忙吗?!提供一个可运行的代码是很容易的事:

import console;
import sqlite;

console.open()
var db = sqlite("/test-sqlite-thread.db")

//创建表
if( not db.existsTable("film") ){  
    db.exec(
"CREATE TABLE [film](title, length, year, starring);")
}

//创建线程  
var func = function(){
        
   
import sqlite;
   
var db = sqlite("/test-sqlite-thread.db")
   
   
//多线程冲突锁定时的重试次数
    db.busyTimeout(10000);
   
   
var command = db.prepare("REPLACE INTO film VALUES (@title,@length,@year, 'Jodie Foster');" )
   
for(i=1;10;1){
        command.step(  
            title =
"标题";
            length = 4;
            year = thread.getId();
        )   
    }
}
   
var t1 = thread.create( func )
var t2 = thread.create( func )
var t3 = thread.create( func )
var t4 = thread.create( func )
var t5 = thread.create( func )
var t6 = thread.create( func )

thread.waitClose(t1,t2,t3,t4,t5,t6)

for title, length, year, starring in db.each("SELECT * FROM film") {
    console.log( title, length, year, starring  )
}

//删除表
db.exec("DROP TABLE film" );

console.pause(
true);




Jacen.He 发表于 2018-4-16 22:09:15
另外,提问的时候,请发到相关版块,例如这个问题请发到sqlite版块,
找不到,就是因为你们提问都不发到相关版块,增加了你们自己查找资料的难度。
Jacen.He 发表于 2018-4-16 22:11:06
另外,尽量不要这么用,
基本上在客户端软件中没有任何的必要多线程同时写sqlite数据库。

把多线程的程序比喻成一家公司,
公司只要一个人负责记账就可以了,没必要每个线程都去做这件事。
sunshuyan 发表于 2018-4-16 22:19:21
{:handshake:}

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-7-19 19:42 , Processed in 0.046875 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表