我有一個回圈打開到遠程 SFTP 服務器的多個連接。每個會話都需要驗證遠程主機的密鑰,但現有的密鑰串列只需要加載一次。
我正在使用的 libssh2 API 需要一個現有的會話來加載串列,因此在進入回圈之前我無法讀取它——因為會話是在其中初始化的。
是否有編譯指示,這將允許我:
- 制作一個執行緒——我不在乎,是哪一個——加載
~/.ssh/known_hosts. - 導致所有其他執行緒等待那個幸運的執行緒執行它?
我試過了:
#pragma omp for
for (i = 0; i < jobs; i ) {
sessions[i] = libssh2_session_init();
...
#pragma omp task
{
known = load_known_hosts(sessions[i], ...);
}
#pragma omp taskwait
check_known_hosts(known, ...);
...
}
這可以編譯,但不能按預期作業——當check_known_hosts()嘗試使用串列時,串列仍未初始化。
uj5u.com熱心網友回復:
我的建議如下(類似于@deamcrash 的建議,但也可以并行進行初始化)
#pragma omp parallel
{
...
#pragma omp for
for (i = 0; i < jobs; i ) {
//initialization in parallel
sessions[i] = libssh2_session_init();
...
}
#pragma omp single
{
// work done by a single thread
known = load_known_hosts(...);
...
}
#pragma omp for
for (i = 0; i < jobs; i ) {
//other parallel work
check_known_hosts(known, ...);
....
}
...
}
uj5u.com熱心網友回復:
如果沒有更多背景關系,我會選擇:
#pragma omp single
{
sessions[0] = libssh2_session_init();
...
known = load_known_hosts(sessions[0], ...);
...
check_known_hosts(known, ...);
...
}
#pragma omp for
for (i = 1; i < jobs; i ) {
sessions[i] = libssh2_session_init();
...
check_known_hosts(known, ...);
...
}
我會從回圈中提取第一次迭代,在并行回圈之前執行,然后執行回圈。為了使其干凈,您可以從每次回圈迭代中執行的代碼中提取一個方法。
uj5u.com熱心網友回復:
我快速而骯臟的“解決方案”是只為第一份作業加載串列——如果其他作業人員在 job-0 之前到達這一點,他們就會旋轉:
if (i == 0) {
known = load_known_hosts(sessions[0], ...);
if (known == NULL)
errx(EX_SOFTWARE, "Couldn't load known hosts");
} else while (known == NULL)
pthread_yield();
我敢肯定,有一種方法可以正確地做到這一點——使用 OpenMP 編譯指示——所以等待正確的答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495153.html
上一篇:For回圈只回傳最后一個數字
下一篇:使用for回圈更新dict值
