나는 많은 수의 객체를 가지고 있는데, 각각 boost :: shared_mutex와 연관되어있다. (공유/고유 잠금 기능이 필요하다.)std :: lock()은 boost :: shared_mutex와 동일합니까?
코드에서 여러 개체의 고유 한 소유권을 한 번에 얻어야하는 경우가 있습니다.
for (FileMetaData* entry : smd->fileSet) {
entry->fileMutex.lock();
}
// some critical work
for (FileMetaData* entry : smd->fileSet) {
entry->fileMutex.unlock();
}
다른 스레드가 서로 다른 잠금 세트를 얻으려고 시도 할 때 이런 결과가 발생하면 교착 상태가됩니다.
std :: lock()이 사용 사례에 적합하다는 것을 알게되었습니다. boost :: shared_mutex와 동등한가?
편집 : 정확히 내 경우 작동하지 않는 주문 잠금 패턴에 대해서는
:
T1 lock (C,D,E)
T2 wants to lock (B,D), but can only obtain the lock for B
T1 spawns T3 which works on (B,C), it stuck when obtaining the lock for B
그래서 문제가 T1은 T3가 급부상 할 때 B에 별도의 잠금 장치가 필요한 것입니다, 이렇게하면 정렬 된 잠금 패턴이 깨집니다. 나는이 문제가 해결 될 수 있다고 생각한다. T2가 잠글 수 없을 때 T2가 B에 대한 잠금을 유지하지 않는다면, 본질적으로 std :: lock은 잠금이된다. Lockable
가 작동합니다 아무것도 -
: onstruct RAII 잠금 그래서 잠금 해제를 망치지 수
std::lock
에 전달하는, 그래서 실제로 쓸 것 잠금을 시작합니다. 모든 기준을 사용하여 잠금을 정렬하고 순서대로 잠급니다. 모든 스레드가 동일한 잠금 순서를 존중하면 절대로 교착 상태가 될 수 없습니다. – Nemo@Nemo : 정렬 된 알고리즘을 비롯한 다양한 멀티 잠금 알고리즘의 성능 비교는 다음과 같습니다. http://howardhinnant.github.io/dining_philosophers.html –