Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript Atomics.sub() 함수 완벽 가이드 – 문법과 예제

자바스크립트의 Atomics 객체는 add, sub, and, or, xor, load, store 등과 같은 원자적(atomic) 연산을 정적 메서드 형태로 제공하는 객체입니다. 이러한 메서드들은 SharedArrayBuffer 객체와 함께 사용되며, 여러 스레드가 공유 메모리에 동시에 접근할 때 발생할 수 있는 데이터 경합(race condition) 문제를 방지해 줍니다.

Atomics 객체의 sub() 함수는 숫자와 위치(인덱스)를 인수로 받아, 해당 위치에 저장되어 있는 값에서 주어진 숫자를 뺀 후, 뺄셈 이전의 기존 값(old value)을 반환합니다.

문법(Syntax)

Atomics.sub() 함수의 기본 문법은 다음과 같습니다.

Atomics.sub(typedArray, index, value)

매개변수 설명

  • typedArray: SharedArrayBuffer를 기반으로 생성된 정수형 타입 배열(Int8Array, Uint8Array, Int16Array 등)
  • index: 뺄셈 연산을 수행할 배열 내 위치(인덱스)
  • value: 기존 값에서 빼고자 하는 숫자

예제 1: 기본적인 뺄셈 연산

다음 예제는 SharedArrayBuffer에 값을 저장한 후, Atomics.sub()를 사용하여 특정 위치의 값을 감소시키는 방법을 보여줍니다.

<html>
<head>
   <title>JavaScript Example</title>
</head>
<body>
   <script type="text/javascript">
      var arrayBuffer = new SharedArrayBuffer(16);
      var data = new Uint8Array(arrayBuffer);
      data[0] = 30;
      Atomics.sub(data, 0, 10);
      document.write(Atomics.load(data, 0));
   </script>
</body>
</html>

출력 결과

20

위 예제에서 배열의 첫 번째 요소에는 30이 저장되어 있으며, Atomics.sub()를 통해 10을 뺀 결과인 20이 출력됩니다.

예제 2: 반환값 확인하기

Atomics.sub() 함수는 연산 후 이전 값을 반환하므로, 이를 활용하면 연산 전후의 값을 비교할 수 있습니다.

<html>
<head>
   <title>JavaScript Example</title>
</head>
<body>
   <script type="text/javascript">
      var arrayBuffer = new SharedArrayBuffer(16);
      var data = new Uint8Array(arrayBuffer);
      data[0] = 30;
      document.write("Previous: "+Atomics.sub(data, 0, 10));
      document.write("<br>");
      document.write("Result: "+Atomics.load(data, 0));
      document.write("<br>");
      document.write("Previous: "+Atomics.sub(data, 0, 5));
      document.write("<br>");
      document.write("Result: "+Atomics.load(data, 0));
   </script>
</body>
</html>

출력 결과

Previous: 30
Result: 20
Previous: 20
Result: 15

실행 결과를 살펴보면 다음과 같은 흐름으로 동작합니다.

  • 첫 번째 sub() 호출 시 기존 값은 30이었으므로 Previous: 30이 출력되고, 10을 뺀 후의 값은 20이 됩니다.
  • 두 번째 sub() 호출 시점에는 값이 이미 20으로 변경되어 있으므로 Previous: 20이 출력되며, 5를 뺀 최종 결과는 15가 됩니다.

이처럼 Atomics.sub() 함수는 연산 자체를 원자적으로 수행하기 때문에, 멀티스레드 환경에서도 안전하게 공유 데이터를 조작할 수 있다는 점이 가장 큰 장점입니다.