링크 (http://www.cplusplus.com/reference/mutex/mutex/try_lock/)에서 샘플은 1부터 100000까지만 값을 반환 할 수 있다고 선언했습니다. 0을 출력 할 수 없다고 선언합니까?뮤텍스 try_lock에 대한 cpp 사양의 오류?
어떤 경우// mutex::try_lock example
#include <iostream> // std::cout
#include <thread> // std::thread
#include <mutex> // std::mutex
volatile int counter (0); // non-atomic counter
std::mutex mtx; // locks access to counter
void attempt_10k_increases() {
for (int i=0; i<10000; ++i) {
if (mtx.try_lock()) { // only increase if currently not locked:
++counter;
mtx.unlock();
}
}
}
int main()
{
std::thread threads[10];
// spawn 10 threads:
for (int i=0; i<10; ++i)
threads[i] = std::thread(attempt_10k_increases);
for (auto& th : threads) th.join();
std::cout << counter << " successful increases of the counter.\n";
return 0;
}
, 그것은 try_lock "이 때 다른를 외관상 실패 할 수 있습니다 정말 일을 얻을 0
을 결코하는 방법에 대한 분명하지 '어떻게 2를 얻기 위해?'대답 쉽지만, thread는 뮤텍스에 락을 가지고 있지만, 이러한 상황에서 반복 호출은 어떤 시점에서 성공할 것이다. 그러나 참이면 샘플은 0을 반환 할 수 있으며 어떤 경우에는 1을 반환 할 수도있다.
그러나이 사양 샘플이 true로 선언되고 0을 출력 할 수 없으면 "fail spuriously"에 대한 단어가 사실이 아닐 수 있습니다.
에 much closer 인 cppreference.com을 사용하는 것이 더 안전합니다. 10000 회에 '반복 호출'을 부르겠습니까? – marc
아 [cplusplus.com의 기쁨 (http://stackoverflow.com/q/6520052/596781). 비록 당신이 현학적이라면, 사이트는 0이 불가능하다고 주장하지 않습니다. 그것은 단지 1-100000이 가능하다고 주장합니다. –
나는 그것이 언어 내에서 공식화하기가 매우 어려운 글로벌 진행 보장의 가장자리 사례 중 하나라고 말하고 싶지만,하지만 일종의 합리적인 플랫폼에서 그 가정 어디에, try_lock' '의 실패는 * 일부 * 다른 스레드를 의미한다 * 어느 시점에서 * 진전이있었습니다. –