이 글에서는 CAS(Compare And Swap)에 대해서 설명합니다.
- CAS (Compare And Swap) In C Language
- CAS synchronization between processes
CAS (Compare And Swap) In C Language
CAS (Compare And Swap) is a concurrency control operation used in multi-threaded programming to implement synchronization between threads. CAS allows for an atomic read-modify-write operation on a shared memory location. In other words, it allows a thread to check if a shared variable has a particular value, and if it does, it swaps the value with a new value.
CAS is implemented differently in different programming languages, but the basic idea is the same. In C and C++, CAS is implemented using built-in functions provided by the compiler or using inline assembly code.
CAS(Compare And Swap)는 다중 스레드 프로그래밍에서 스레드 간 동기화를 구현하는 데 사용되는 동시성 제어 작업입니다. CAS는 공유 메모리 위치에서 원자적 읽기-수정-쓰기 작업을 허용합니다. 즉, 스레드가 공유 변수에 특정 값이 있는지 확인하고 값이 있는 경우 해당 값을 새 값으로 교환합니다.
CAS는 프로그래밍 언어에 따라 다르게 구현되지만 기본 개념은 동일합니다. C 및 C++에서 CAS는 컴파일러에서 제공하는 내장 함수 또는 인라인 어셈블리 코드를 사용하여 구현됩니다.
Here's an example of how CAS works in C:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <pthread.h>
int shared_variable = 0;
bool CAS(int *ptr, int expected_value, int new_value) {
return __sync_bool_compare_and_swap(ptr, expected_value, new_value);
}
void *worker_thread(void *arg) {
int expected_value = 0;
int new_value = 1;
while (!CAS(&shared_variable, expected_value, new_value)) {
expected_value = shared_variable;
new_value = expected_value + 1;
}
printf("Thread %ld swapped shared variable value to %d\n", (long)arg, shared_variable);
return NULL;
}
int main() {
pthread_t threads[10];
for (long i = 0; i < 10; i++) {
pthread_create(&threads[i], NULL, worker_thread, (void *)i);
}
for (int i = 0; i < 10; i++) {
pthread_join(threads[i], NULL);
}
printf("Final shared variable value: %d\n", shared_variable);
return 0;
}
In this example, we have a shared variable called shared_variable, which is initially set to 0. We create 10 worker threads, and each thread attempts to set the value of shared_variable to shared_variable + 1 using the CAS operation. The CAS function takes a pointer to the shared variable, the expected value (shared_variable in this case), and the new value (shared_variable + 1 in this case).
If the current value of the shared variable matches the expected value, the CAS operation swaps the value to the new value and returns true. If the current value does not match the expected value, the CAS operation does not modify the value and returns false.
The worker threads loop until they successfully swap the value of the shared variable. They do this by calling the CAS function and checking its return value. If the return value is false, it means that another thread modified the shared variable in the meantime, so the worker thread updates its expected value to the current value of the shared variable and tries again.
In the main function, we wait for all the worker threads to finish, and then print out the final value of the shared variable. In this example, the final value should be 10 (exactly 10 times), since all the worker threads successfully swapped the value to shared_variable + 1.
이 예제에서는 shared_variable이라는 공유 변수가 있습니다. 이 변수는 초기값으로 0으로 설정됩니다. 우리는 10개의 워커 스레드를 만들고, 각 스레드는 CAS 연산을 사용하여 shared_variable의 값을 1 더한 값으로 설정하려고 시도합니다. CAS 함수는 공유 변수에 대한 포인터, 기대값, 그리고 새 값(공유 변수 + 1)을 가져옵니다.
공유 변수의 현재 값이 기대값과 일치하는 경우, CAS 연산은 값을 새 값으로 교환하고 true를 반환합니다. 현재 값이 기대값과 일치하지 않는 경우, CAS 연산은 값을 수정하지 않고 false를 반환합니다.
워커 스레드는 공유 변수의 값을 성공적으로 교환할 때까지 루프를 반복합니다. 이를 위해 CAS 함수를 호출하고 반환 값을 확인합니다. 반환 값이 false인 경우, 다른 스레드가 그 사이에 공유 변수를 수정했다는 것을 의미하므로 워커 스레드는 기대값을 공유 변수의 현재 값으로 업데이트하고 다시 시도합니다.
main 함수에서는 모든 워커 스레드가 완료될 때까지 기다리고, 그 후에 공유 변수의 최종 값을 출력합니다. 이 예제에서 최종 값은 모든 워커 스레드가 값을 공유 변수 + 1로 성공적으로 교환했기 때문에 10이어야 합니다.
Compile
% gcc -o casPthread testcasPthread.c -std=c99 -lpthread
Execute
% ./casPthread Thread 0 swapped shared variable value to 1 Thread 2 swapped shared variable value to 3 Thread 3 swapped shared variable value to 4 Thread 1 swapped shared variable value to 2 Thread 4 swapped shared variable value to 5 Thread 6 swapped shared variable value to 7 Thread 7 swapped shared variable value to 8 Thread 5 swapped shared variable value to 6 Thread 8 swapped shared variable value to 9 Thread 9 swapped shared variable value to 10
CAS synchronization between processes
CAS (Compare And Swap) is a concurrency control operation that is typically used for synchronization between threads within a single process. CAS allows a thread to atomically read a shared memory location, compare it to an expected value, and conditionally swap the value of the location with a new value, all in a single, atomic operation.
In the next post, we will learn about CAS synchronization between processes using shared memory.
CAS(Compare And Swap)는 일반적으로 단일 프로세스 내의 스레드 간 동기화에 사용되는 동시성 제어 작업입니다. CAS를 사용하면 스레드가 공유 메모리 위치를 원자적으로 읽고 예상 값과 비교하고 위치 값을 새 값으로 조건부로 교환할 수 있습니다.
다음 게시글에서 공유 메모리를 이용한 프로세스간 CAS 동기화에 대해서 알아보겠습니다.