2개의 스레드를 사용하여 i=1을 자동 증가시키고 각 스레드는 이를 100번 실행합니다. 가능한 최대값과 최소값은 얼마입니까? 설명해주세요
또한 물어보세요. ++i는 원자인가요?
PHP中文网2017-05-17 10:02:27
최소값은 3(+2), 최대값은 201(+200)이 될 수 있습니다. . . . 왜 0부터 시작하지 않는 걸까요? . .
주기 프로세스는 다음과 같습니다.
메모리에서 데이터를 읽어 등록
등록값++
데이터를 메모리에 다시 쓰기
다음 세 단계 중 하나에서 스레드가 중단될 수 있습니다. 3의 경우는 다음과 같습니다.
첫 번째 스레드는 1
데이터를 읽은 후 일시 중지되고 레지스터 값은 다른 위치에 저장됩니다. 1
,然后被挂起,寄存器的值被保存到另一个地方。
第二个线程,持续执行了 99 次(此时,内存中的值为 100
),然后被挂起。
第一个线程被唤醒,恢复寄存器的 1
+1 之后 (=2
)被写回内存,该线程被挂起
第二个线程从内存读取2
到寄存器之后被挂起
第一个全部执行完,把值写回内存
唤起第二个线程,恢复寄存器中的2
,完成最后一次循环+1 之后写回 3
所以最终结果是 3
두 번째 스레드는 99번(이때 메모리에 있는 값은 100
) 실행을 계속한 후 일시 중단되었습니다.
첫 번째 스레드가 활성화되고 복구 레지스터(=2
)의 1
+1이 메모리에 다시 기록된 후 스레드가 일시 중지됩니다.
2
를 읽고 일시 중단됩니다. 첫 번째 스레드는 완전히 실행되고 값을 다시 메모리에 씁니다.두 번째 스레드를 호출합니다. 레지스터의 값을 복원합니다. 2
, 마지막 루프 +1을 완료한 후 3을 다시 씁니다
3
입니다. . . . 🎜
🎜아직은 더 작은 스케줄링 방법은 생각해본 적이 없어요. . . 🎜
🎜최대값은 너무 많이 설명할 필요가 없습니다. . . . 🎜PHP中文网2017-05-17 10:02:27
최소값은 2이고 최대값은 200입니다.
2는 두 스레드가 CPU 캐시의 데이터를 수정하고 결국 메모리가 한 번만 새로 고쳐진다는 의미입니다.
200은 두 스레드가 서로 경쟁하지 않고 교대로 읽고 수정한다는 의미입니다.
우리는 모두 최대값과 최소값에 대해 질문했지만 당연히 원자적이지 않습니다.