BBoard 프로젝트에서 비동기 멀티스레딩을 활용하여 네트워크 I/O를 줄여본 경험이 있었지만, 스레드들이 어떻게 자원을 공유하고, 어떠한 문제를 유발할 수 있는지에 대한 이해가 부족했던 것 같아 강의를 들으며 글로 정리해보고자 한다. 오늘 내용은 CPU Cache에 의한 데이터 정합성 문제와 이에 대한 해결 방법을 알아보고자 한다.

멀티 쓰레드 이해하고 통찰력 키우기 강의 내용을 학습한 내용을 정리한 글입니다.
강의에서 제공한 원본 코드 github가 C++로 되어있어 이를 바탕으로 Java로 새로 코드를 작성해보았다.
해당 코드 내에서는 main 스레드에서 thread1 이라는 스레드를 생성하였고, thread1을 실행시키기 위해 Thread.sleep()을 주어 context switching이 발생하도록 하였다.
이후 메인 스레드에서 shouldStop 변수를 true로 변경하였으나, thread1에서 먼저 읽은 shouldStop 값은 false이고, 이를 CPU Cache에서 읽어오기 때문에 변경된 사실을 알지 못한다. 이로 인해 while문을 빠져나오지 못한다.
public class MultiThreadTest {
private static boolean shouldStop = false; // 두 Thread가 공유하는 변수
static class MyThread extends Thread{
public void run(){
boolean toggle = false;
System.out.println("working...");
while(shouldStop == false){
toggle = !toggle;
}
System.out.println("done!");
}
}
public static void main(String[] args) throws InterruptedException {
System.out.println("Process Start!");
Thread thread1 = new MyThread();
thread1.start();
Thread.sleep(1000); // thread1로 실행하기 위해서 context switching 발생시킴
shouldStop = true; // 변수를 변경하였으나 thread1에서는 CPU cache에서 데이터를 읽기 때문에 이를 감지하지 못함
thread1.join();
System.out.println("All Done!");
}
}
Process Start!
working...
private static volatile boolean shouldStop = false;
Process Start!
working...
done!
All Done!