이 코드를 사용하여 스핀록이 컨텍스트 전환을 방지하는 방법을 시각화합니다.
pthread_spinlock_t lock;
void pp()
{
pthread_spin_lock(&lock);
char d = 'D';
while(1) write(1, &d, 1);
}
void ppp()
{
char a = 'C';
while(1) write(1, &a, 1);
}
int main()
{
pthread_t thread;
pthread_t tthread;
pthread_spin_init(&lock, PTHREAD_PROCESS_PRIVATE);
pthread_create(&thread, NULL, pp, NULL);
pthread_create(&tthread, NULL, ppp, NULL);
pthread_join(thread, NULL);
pthread_join(tthread,NULL);
}
문제는 pp() 및 출력이 완료될 때 잠금을 해제하지 않기 때문에 두 번째 스레드로 전환하지 않을 것으로 예상한다는 것입니다 DDDDDDDDDDDD
. 내 이해로는 컨텍스트 전환을 방지해야 하기 때문입니다. 그러나 내가 얻는 출력은 다음과 같은 형식입니다. DCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDCDC
...
이것을 어떻게 설명할 수 있나요? 스핀 잠금에 대한 나의 이해가 올바르지 않습니까?
답변1
상호 배타적이어야 하는 모든 스레드에서 잠금을 획득해야 합니다.
void ppp()
{
pthread_spin_lock(&lock);
char a = 'C';
while(1) write(1, &a, 1);
}
컨텍스트 스위칭은 그렇지 않습니다.예방하다잠금으로 인해 스레드가 동일한 잠금을 획득하려고 시도함으로써 스레드가 동시에 진행되는 것을 방지할 수 있습니다. 잠금을 획득할 수 있을 때까지 잠금을 획득할 수 없는 스레드가 회전합니다.