최소값은 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입니다. . . . 🎜
🎜아직은 더 작은 스케줄링 방법은 생각해본 적이 없어요. . . 🎜
🎜최대값은 너무 많이 설명할 필요가 없습니다. . . . 🎜
최소값은 2이고 최대값은 200입니다. 2는 두 스레드가 CPU 캐시의 데이터를 수정하고 결국 메모리가 한 번만 새로 고쳐진다는 의미입니다. 200은 두 스레드가 서로 경쟁하지 않고 교대로 읽고 수정한다는 의미입니다. 우리는 모두 최대값과 최소값에 대해 질문했지만 당연히 원자적이지 않습니다.
최소값은 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
입니다. . . . 🎜 🎜아직은 더 작은 스케줄링 방법은 생각해본 적이 없어요. . . 🎜 🎜최대값은 너무 많이 설명할 필요가 없습니다. . . . 🎜최소값은 2이고 최대값은 200입니다.
2는 두 스레드가 CPU 캐시의 데이터를 수정하고 결국 메모리가 한 번만 새로 고쳐진다는 의미입니다.
200은 두 스레드가 서로 경쟁하지 않고 교대로 읽고 수정한다는 의미입니다.
우리는 모두 최대값과 최소값에 대해 질문했지만 당연히 원자적이지 않습니다.