스플리어스 웨이크업
Spurious wakeup이 문서의 어조나 문체는 위키피디아에서 사용되는 백과사전적 어조를 반영하지 못할 수 있습니다.(2020년 9월 (이 및 ) |
스플리어스 웨이크업은 스레드가 시그널링된 조건변수 대기상태에서 깨어나 대기상태가 충족되지 않은 것을 검출했을 때 발생합니다.실타래가 아무 이유 없이 깨어난 것 같아서 스플리어스라고 합니다.그러나 스플리어스 웨이크업은 아무 이유 없이 발생하는 것이 아닙니다.통상 조건 변수가 시그널링된 시각과 대기 스레드가 마지막으로 실행되었을 때 다른 스레드가 실행되어 조건이 변경되었기 때문입니다.스레드 사이에 레이스 조건이 있었는데, 전형적인 결과로는 조건 변수에서 깨어난 스레드가 먼저 달려 레이스에서 이기고, 때로는 두 번째로 달려 레이스에서 졌다.
많은 시스템, 특히 멀티프로세서 시스템에서는 스플리어스 웨이크업 문제가 악화됩니다.이는 시그널링될 때 조건변수에 여러 스레드가 대기하고 있는 경우 시스템이 모든 스레드를 웨이크업하여 처리하도록 결정할 수 있기 때문입니다.signal( )
실 한 가닥을 깨우다broadcast( )
따라서 신호와 [1]웨이크업 사이의 예상되는 1:1 관계가 깨지게 됩니다.10개의 스레드가 대기하고 있는 경우, 1개만 우승하고 나머지 9개는 가짜 웨이크업을 경험하게 됩니다.
operating system내의 에러 상태나 레이스에 대한 실장의 유연성을 확보하기 위해서, 몇개의 실장이 실제로 행해지고 있는지는 불명확하지만, 시그널링이 되어 있지 않아도, 조건 변수가 대기로부터 돌아오는 것이 허가되는 경우가 있습니다.Solaris의 조건 변수 실장에서는 프로세스가 시그널링되면 조건이 시그널링되지 않고 스플리어스 웨이크업이 발생할 수 있습니다.대기 시스템콜이 중단되어 반환됩니다.EINTR
조건 변수의 Linux p-thread 구현은 [3][4]이를 수행하지 않음을 보증합니다.[2]
스플리어스 웨이크업은 레이스가 있을 때마다 발생할 수 있으며 레이스나 신호가 없는 경우에도 발생할 수 있으므로 스레드가 조건변수로 웨이크업할 때는 항상 원하는 조건이 충족되는지 확인해야 합니다.그렇지 않은 경우 조건변수로 sleep 상태로 돌아가 다른 기회를 기다립니다.
레퍼런스
- ^ Raymond Chen (February 1, 2018). "Spurious wake-ups in Win32 condition variables". Retrieved May 9, 2020.
- ^ "Interrupted Waits on Condition Variables (Solaris Threads Only)". Oracle Corporation. Retrieved May 9, 2020.
- ^ "pthread_cond_wait(3) - Linux man page". die.net. Retrieved May 9, 2020.
These functions shall not return an error code of [EINTR].
- ^ "pthread_cond_timedwait, pthread_cond_wait - wait on a condition". The Open Group. 2018. Retrieved May 9, 2020.