2017-09-27 50 views
3

我正在嘗試開發一種具有多線程功能的軟件。 在Linux上,腳本工作正常,我使用的模塊是'叉'。 換句話說,在查詢數據庫和類似的東西時,線程之間沒有共享處理程序的問題。 一旦我試圖在Windows上運行腳本(草莓Perl),當我嘗試安裝分支時,它說「叉模塊」不支持當前版本的操作系統(64位)。 移過來,我決定使用''線程'',但是我得到了以下錯誤,幾乎肯定與線程之間的共享處理程序相關聯。Perl多線程:跨平臺腳本中的''叉''和''線程''

'' 線程1異常終止:DBD :: SQLite :: db準備失敗:句柄2由線程擁有d97fe8不是當前線程3a01058(句柄不能在線程之間共享,並且您的驅動程序可能需要CLONE方法添加)在file.pl行180,第1行。 ''

如何解決上述問題,並使腳本可以在Windows上運行Strawberry Perl?

+1

看來你需要編寫你的數據庫的自己使用'fork'而不是線程的處理,因爲'forks'模塊的作品。數據庫告訴你,你不能在線程之間共享句柄,所以你需要使用流程來解決這個問題。 –

+1

爲什麼使用_forks_模塊,而不是用內置的'fork'編寫自己的東西? _forks_的文檔說這是您已經擁有_threads_的替代品,但不再需要它們。 [但它不能在Windows上運行](http://matrix.cpantesters.org/?dist=forks+0.36)。沒有辦法解決這個問題。 _threads_只是壞了。你需要使用適當的'fork'來重建自己的實現。你是怎麼想出_forks_模塊的?我已經做了超過10年的Perl,並且在此之前我從未聽說過它。 – simbabque

+1

這是一個相對較新的事物,由'線索不鼓勵'引發。國際海事組織使用它的理由並不多。 – Sobrique

回答

0

首先,感謝大家的及時答覆和非常好的建議。 這是我的解決方案。 顯然,似乎沒有必要爲每個線程創建一個新的db處理程序,只需每次創建新線程時連接到數據庫。 所以,如果你正在使用「」線',我認爲這應該足以包括'threads->創建'方法內以下行以使其可以運行:

$dbh = DBI->connect("dbi:SQLite:db_name.dbl") || die "Cannot connect: $DBI::errstr"; 

正如你可以看到,處理程序是靜態的,但它不是在 線程之間「字面上」共享「,因爲每次連接到數據庫時都會創建該線程,所以每次運行新線程時都會這樣!

請不要問我爲什麼原來的腳本在Linux中使用'叉子'正常工作,沒有這個伎倆......似乎用'叉子''你不需要關心共享處理程序。再次

感謝