2013-04-12 108 views
3

在Matlab(2012b)中,有沒有辦法在發送數據之前暫停由SPMD創建的一個線程?因爲線程2只有有限大小的緩衝區來接受來自線程1的數據,並且根據matlab,labSend()將在數據傳輸完成之前返回,這意味着理論上線程1可以繼續向線程2發送數據,直到系統運行內存不足:在Matlab中使用SPMD發送數據

我想要做的是這樣的:

spmd (2) 

    if labindex==1 
    %... 
    if (BufferAtLab2isNotFull) 
     labSend(data, 2); 
    end 
    %... 
    elseif labindex==2 
    if (BufferNotFull) 
     labReceive(data, 1); 
    end 
    %... 

    end 
end 

在C/C++中,它是很容易做到這一點與共享內存多線程,但在MATLAB現在看來,這是相當很難,因爲沒有共享資源來檢查。

回答

0

如果你想實驗室1至2實驗室已經完成它的每個labSend後等待的labRecieve,然後在labBarrier每個這將導致實驗室1簡單的添加等到所有線程都達到這一點。

spmd (2) 
    if labindex==1 
    %... 
    if (BufferAtLab2isNotFull) 
     labSend(data, 2); 
    end 
    labBarrier; 
    %... 
    elseif labindex==2 
    labSend(bufSize,1); 
    %... 
    if (BufferNotFull) 
     labReceive(data, 1); 
    end 
    labBarrier; 
    %... 
    end 
end 

如果您擔心實驗室1發送太多單一labSend你總是可以有實驗室2第一次發送的緩衝區大小。