2014-08-30 325 views
0

當多線程使用時,Qt容器是安全的只讀模式。但是寫訪問呢?我可以調整QVector的大小並在不同的線程中使用operator[]進行書寫嗎? QVector的大小將保持不變,每個線程將寫入不同的內存位置(每個線程都有自己的索引),因此不會有同樣的內存同時訪問。 QVector將是一個全局變量。QVector預分配訪問線程安全

+0

如果每個線程寫入矢量的單獨部分,則不需要在單個矢量中包含所有這些數據。有一個每個線程向量。 – 2014-08-30 20:12:27

+0

@KubaOber其實我是這樣做的,我需要確保向量的順序與我有一個單線程應用程序的順序相同。如果我在線程完成後嘗試加入向量將會更困難。 – Nazar554 2014-08-31 06:56:03

回答

1

Qt文檔定義QVector的成員函數爲reentrant,這意味着如果每個線程都有不同的QVector實例,則從線程調用它的方法是安全的。這意味着QVector不會像您打算使用它的方式那樣線程安全。

如果您可以保證您的QVector寫入不會改變其長度並且不會重疊,您可能會發現不會有問題。但是如果你知道你將要寫入矢量的不同區域,爲什麼不將矢量分成子矢量並且在每個子矢量上使用一個線程?這將使您能夠保證您不會遇到線程相關的問題。當您的工作完成後,您可以將矢量替換爲單個實體。