搜索
查看: 1234|回复: 7

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

[复制链接]

8

主题

20

帖子

115

积分

一级会员

Rank: 2

积分
115
发表于 2018-4-16 20:27:26 | 显示全部楼层 |阅读模式
请教一个关于多线程的问题
代码量太大,这里缩减代码,只描述思路:

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

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

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

使用道具 举报

4

主题

63

帖子

485

积分

二级会员

Rank: 3Rank: 3

积分
485
发表于 2018-4-16 21:08:05 | 显示全部楼层
看上去,这个应该是sqlite的问题,不是aardio方面的问题。
关于SQLite多线程的问题可以参考这个:SQLite在多线程环境下的应用 - CSDN博客
https://blog.csdn.net/diyagoanyhacker/article/details/7209888
和sqlite官方的解释。
回复

使用道具 举报

12

主题

679

帖子

4008

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4008
发表于 2018-4-16 21:14:26 | 显示全部楼层
论坛里搜不到,那是因为没人傻到明知道不能同时操作数据库,还要去写!
我觉得你应该学习 c , 数据库知识 然后自己实现一个可以同时写入的数据库。
回复

使用道具 举报

8

主题

20

帖子

115

积分

一级会员

Rank: 2

积分
115
 楼主| 发表于 2018-4-16 21:28:01 | 显示全部楼层
我要的不是一定要 “同时写入数据库”。我知道同时不能写入
我想知道如何才能不让两个线程不冲突,比如遇到数据库写入时,让另外一个线程等待下,或者其他的排队的办法。
我想大概有这样的方法吧
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 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);




回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-4-16 22:09:15 | 显示全部楼层
另外,提问的时候,请发到相关版块,例如这个问题请发到sqlite版块,
找不到,就是因为你们提问都不发到相关版块,增加了你们自己查找资料的难度。
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13974
发表于 2018-4-16 22:11:06 | 显示全部楼层
另外,尽量不要这么用,
基本上在客户端软件中没有任何的必要多线程同时写sqlite数据库。

把多线程的程序比喻成一家公司,
公司只要一个人负责记账就可以了,没必要每个线程都去做这件事。
回复

使用道具 举报

8

主题

20

帖子

115

积分

一级会员

Rank: 2

积分
115
 楼主| 发表于 2018-4-16 22:19:21 | 显示全部楼层
{:handshake:}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2018-12-15 14:21 , Processed in 0.062500 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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