{"id":11804,"date":"2026-08-07T14:08:26","date_gmt":"2026-08-07T05:08:26","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11804"},"modified":"2026-08-07T14:08:26","modified_gmt":"2026-08-07T05:08:26","slug":"11804","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11804","title":{"rendered":""},"content":{"rendered":"<h1>C\/C++ \uba40\ud2f0\uc2a4\ub808\ub4dc\uc640 \uc784\ubca0\ub514\ub4dc \ucee4\ub110 \ud504\ub85c\uadf8\ub798\ubc0d\uc758 \ud575\uc2ec: Atomic \uc5f0\uc0b0 \uc644\ubcbd \uc815\ub9ac (<code>ATOMIC_INIT<\/code>, <code>atomic_read<\/code>, <code>atomic_set<\/code>, <code>atomic_cas<\/code>)<\/h1>\n<p>\uba40\ud2f0\uc2a4\ub808\ub4dc(Multi-threaded) \ud658\uacbd\uc774\ub098 \uc784\ubca0\ub514\ub4dc RTOS \/ Linux \ucee4\ub110 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uc9c4\ud589\ud560 \ub54c \uac00\uc7a5 \ud754\ud788 \uc811\ud558\uac8c \ub418\ub294 \ubb38\uc81c \uc911 \ud558\ub098\uac00 \ubc14\ub85c <strong>\uacbd\ud569 \uc870\uac74(Race Condition)<\/strong>\uc785\ub2c8\ub2e4. \uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub098 \uc778\ud130\ub7fd\ud2b8 \ud578\ub4e4\ub7ec\uac00 \ub3d9\uc2dc \ub2e4\ubc1c\uc801\uc73c\ub85c \uac19\uc740 \uba54\ubaa8\ub9ac \uacf5\uac04\uc744 \uc77d\uace0 \uc4f8 \ub54c \ubc1c\uc0dd\ud558\uba70, \uc774\ub294 \uc608\uce21\ud560 \uc218 \uc5c6\ub294 \ubc84\uadf8\uc640 \uc2dc\uc2a4\ud15c \ubd95\uad34\ub97c \uc77c\uc73c\ud0b5\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub7ec\ud55c \ub3d9\uae30\ud654 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \uac00\uc7a5 \ud754\ud788 \ub5a0\uc62c\ub9ac\ub294 \ubc29\uc2dd\uc740 Mutex(\ubba4\ud14d\uc2a4)\ub098 Spinlock(\uc2a4\ud540\ub77d)\uc785\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uac04\ub2e8\ud55c \uc0c1\ud0dc \ud50c\ub798\uadf8 \ubcc0\uacbd\uc774\ub098 \uce74\uc6b4\ud305 \uc5f0\uc0b0\uc5d0 \ub9e4\ubc88 Lock\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc740 <strong>\ubb38\ub9e5 \uad50\ud658(Context Switch) \uc624\ubc84\ud5e4\ub4dc<\/strong>\uc640 <strong>\uc131\ub2a5 \uc800\ud558<\/strong>\ub97c \uc57c\uae30\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774\ub54c \ud65c\uc6a9\ub418\ub294 \uac83\uc774 \ubc14\ub85c CPU\uc758 \uc6d0\uc790\uc801 \uba85\ub839\uc5b4\ub97c \ud65c\uc6a9\ud55c <strong>Atomic(\uc6d0\uc790\uc801) \uc5f0\uc0b0<\/strong>\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc774\ubc88 \ud3ec\uc2a4\ud305\uc5d0\uc11c\ub294 \uc784\ubca0\ub514\ub4dc \ubc0f \ucee4\ub110 \uac1c\ubc1c\uc5d0\uc11c \uc790\uc8fc \uc0ac\uc6a9\ub418\ub294 \ud575\uc2ec \uc6d0\uc790\uc801 \ubcc0\uc218 \ubc0f \uc5f0\uc0b0\uc790 4\uac00\uc9c0 (<code>ATOMIC_INIT<\/code>, <code>atomic_read<\/code>, <code>atomic_set<\/code>, <code>atomic_cas<\/code>)\uc758 \uc5ed\ud560\uacfc \ub3d9\uc791 \uc6d0\ub9ac, \uadf8\ub9ac\uace0 \uc2e4\uc81c \uc0ac\uc6a9 \uc608\uc81c\uae4c\uc9c0 \uc644\ubcbd\ud788 \uc815\ub9ac\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<hr \/>\n<h2>1. Atomic(\uc6d0\uc790\uc801) \uc5f0\uc0b0\uc774\ub780?<\/h2>\n<p>\ucef4\ud4e8\ud130 \uacfc\ud559\uc5d0\uc11c <strong>\uc6d0\uc790\uc801(Atomic)<\/strong>\uc774\ub77c\ub294 \ub9d0\uc740 &quot;\ub354 \uc774\uc0c1 \ucabc\uac24 \uc218 \uc5c6\ub294 \ub2e8\uc77c \ub2e8\uc704\uc758 \uc2e4\ud589&quot;\uc744 \uc758\ubbf8\ud569\ub2c8\ub2e4. <\/p>\n<p>\uc77c\ubc18\uc801\uc73c\ub85c C\uc5b8\uc5b4\uc5d0\uc11c <code>count++<\/code> \ud639\uc740 <code>flag = 1<\/code> \uacfc \uac19\uc740 \ubb38\uc7a5\uc740 assembly \ub808\ubca8\ub85c \ubcc0\ud658\ub418\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \uc5ec\ub7ec \ub2e8\uacc4\ub85c \ub098\ub269\ub2c8\ub2e4:<\/p>\n<ol>\n<li>\uba54\ubaa8\ub9ac\uc5d0\uc11c \uac12\uc744 \uc77d\uc5b4 \ub808\uc9c0\uc2a4\ud130\ub85c \ub85c\ub4dc (READ)<\/li>\n<li>\ub808\uc9c0\uc2a4\ud130\uc758 \uac12\uc744 \ubcc0\uacbd (MODIFY)<\/li>\n<li>\ub808\uc9c0\uc2a4\ud130\uc758 \uac12\uc744 \ub2e4\uc2dc \uba54\ubaa8\ub9ac\uc5d0 \uc800\uc7a5 (WRITE)<\/li>\n<\/ol>\n<p>\ub9cc\uc57d 1\ubc88\uacfc 3\ubc88 \ub2e8\uacc4 \uc0ac\uc774\uc5d0\uc11c \ub2e4\ub978 \uc2a4\ub808\ub4dc\uac00 \uac1c\uc785\ud558\uc5ec \uac12\uc744 \uc77d\uac70\ub098 \uc218\uc815\ud558\uba74 \ub370\uc774\ud130 \uc624\uc5fc\uc774 \ubc1c\uc0dd\ud569\ub2c8\ub2e4.<\/p>\n<p>\ubc18\uba74 <strong>Atomic \uc5f0\uc0b0<\/strong>\uc740 CPU \ucc28\uc6d0\uc758 \ud558\ub4dc\uc6e8\uc5b4 \uc9c0\uc6d0 \uba85\ub839\uc5b4(x86\uc758 <code>LOCK<\/code> Prefix, ARM\uc758 <code>LDREX\/STREX<\/code> \ub4f1)\ub97c \uc774\uc6a9\ud558\uc5ec <strong>[\uc77d\uae30-\uc218\uc815-\uc4f0\uae30]\uc758 \uc804 \uacfc\uc815\uc744 \uc911\uac04\uc5d0 \uc778\ud130\ub7fd\ud2b8\ub098 \ub2e4\ub978 CPU \ucf54\uc5b4\uac00 \uac1c\uc785\ud560 \uc218 \uc5c6\ub294 \ud558\ub098\uc758 \ub2e8\uc704\ub85c \ucc98\ub9ac<\/strong>\ud569\ub2c8\ub2e4.<\/p>\n<hr \/>\n<h2>2. \ud575\uc2ec Atomic \ud0a4\uc6cc\ub4dc &amp; \ud568\uc218 \ud574\uc124<\/h2>\n<h3>\u2460 <code>ATOMIC_INIT(val)<\/code> \u2014 \uc6d0\uc790\uc801 \ubcc0\uc218\uc758 \uc120\uc5b8 \ubc0f \ucd08\uae30\ud654<\/h3>\n<p><code>ATOMIC_INIT<\/code>\uc740 <code>atomic_t<\/code> \ud0c0\uc785 \ubcc0\uc218\ub97c \uc815\uc801\uc73c\ub85c \ucd08\uae30\ud654\ud560 \ub54c \uc0ac\uc6a9\ub418\ub294 \ub9e4\ud06c\ub85c\uc785\ub2c8\ub2e4. <\/p>\n<ul>\n<li><strong>\uae30\ub2a5<\/strong>: atomic \ubcc0\uc218\ub97c \uc120\uc5b8\ud568\uacfc \ub3d9\uc2dc\uc5d0 \ucd08\uae30 \uac12\uc744 \uc548\uc804\ud558\uac8c \uc124\uc815\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>\uc8fc\uc694 \uc6a9\ub3c4<\/strong>: \uc804\uc5ed \ubcc0\uc218\ub098 <code>static<\/code> \ubcc0\uc218\ub97c \uc120\uc5b8\ud560 \ub54c \ucef4\ud30c\uc77c \ud0c0\uc784\uc5d0 \ucd08\uae30\ud654\ud558\ub294 \uc6a9\ub3c4\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<pre><code class=\"language-c\">\/\/ \uc608\uc2dc: DHCP IP \ud560\ub2f9 \ud50c\ub798\uadf8\ub97c 0(Unbound)\uc73c\ub85c \uc815\uc801 \ucd08\uae30\ud654\nstatic atomic_t ethernet_dhcp_bound_flag = ATOMIC_INIT(0);<\/code><\/pre>\n<hr \/>\n<h3>\u2461 <code>atomic_read(const atomic_t *v)<\/code> \u2014 \uc548\uc804\ud55c \uc6d0\uc790\uc801 \uac12 \uc77d\uae30<\/h3>\n<ul>\n<li><strong>\uae30\ub2a5<\/strong>: atomic \ubcc0\uc218 <code>v<\/code>\uc758 \ud604\uc7ac \uac12\uc744 \uc548\uc804\ud558\uac8c \uc77d\uc5b4\uc635\ub2c8\ub2e4.<\/li>\n<li><strong>\uc65c \uc77c\ubc18 \uc77d\uae30 \ub300\uc2e0 \uc0ac\uc6a9\ud560\uae4c?<\/strong>: \ucef4\ud30c\uc77c\ub7ec \ucd5c\uc801\ud654\ub85c \uc778\ud574 \ubcc0\uc218\uac00 \ub808\uc9c0\uc2a4\ud130\uc5d0 \uce90\uc2f1\ub418\uac70\ub098, \uba85\ub839\uc5b4\uac00 \uc7ac\ubc30\uce58(Reordering)\ub418\ub294 \ud604\uc0c1\uc744 \ubc29\uc9c0\ud569\ub2c8\ub2e4. \ub610\ud55c \uba54\ubaa8\ub9ac \ubc30\ub9ac\uc5b4(Memory Barrier) \ud6a8\uacfc\ub97c \ub3d9\ubc18\ud558\uc5ec \ud56d\uc0c1 \uba54\ubaa8\ub9ac\uc758 \ucd5c\uc2e0 \uc0c1\ud0dc\ub97c \uc77d\uc5b4\uc62c \uc218 \uc788\ub3c4\ub85d \ubcf4\uc7a5\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<pre><code class=\"language-c\">\/\/ \uc608\uc2dc: DHCP \ud560\ub2f9 \uc0c1\ud0dc \uc77d\uae30\nint is_bound = atomic_read(&amp;ethernet_dhcp_bound_flag);\n\nif (is_bound) {\n    \/\/ \ub124\ud2b8\uc6cc\ud06c \ud1b5\uc2e0 \uc2dc\uc791\n}<\/code><\/pre>\n<hr \/>\n<h3>\u2462 <code>atomic_set(atomic_t *v, int i)<\/code> \u2014 \uc548\uc804\ud55c \uc6d0\uc790\uc801 \uac12 \uc4f0\uae30<\/h3>\n<ul>\n<li><strong>\uae30\ub2a5<\/strong>: atomic \ubcc0\uc218 <code>v<\/code>\uc5d0 \uc815\uc218 \uac12 <code>i<\/code>\ub97c \uc6d0\uc790\uc801\uc73c\ub85c \ub300\uc785(\uc4f0\uae30)\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>\ud2b9\uc9d5<\/strong>: \ub2e8\uc21c\ud55c \ub300\uc785 \uc5f0\uc0b0\uc774\uc9c0\ub9cc \ud0c0 \uc2a4\ub808\ub4dc\uc640\uc758 \uc77d\uae30\/\uc4f0\uae30 \ucda9\ub3cc \uc5c6\uc774 \uae54\ub054\ud558\uac8c \uac12\uc744 \ubcc0\uacbd\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<pre><code class=\"language-c\">\/\/ \uc608\uc2dc: DHCP \ud560\ub2f9 \uc131\uacf5 \uc2dc \ud50c\ub798\uadf8\ub97c 1\ub85c \ubcc0\uacbd\nvoid on_dhcp_success(void) {\n    \/\/ ... IP \uad00\ub828 \uc124\uc815 \uc644\ub8cc \ud6c4 ...\n    atomic_set(&amp;ethernet_dhcp_bound_flag, 1);\n}<\/code><\/pre>\n<hr \/>\n<h3>\u2463 <code>atomic_cas(atomic_t *v, int old_val, int new_val)<\/code> \u2014 Compare-And-Swap (\ube44\uad50 \ubc0f \uad50\ud658)<\/h3>\n<p><code>atomic_cas<\/code> (\ub610\ub294 Linux \ucee4\ub110\uc758 <code>atomic_cmpxchg<\/code>)\ub294 Lock-Free \uc54c\uace0\ub9ac\uc998\uc758 \uac00\uc7a5 \ud575\uc2ec\uc774 \ub418\ub294 \uc5f0\uc0b0\uc785\ub2c8\ub2e4.<\/p>\n<ul>\n<li><strong>\uae30\ub2a5<\/strong>:\n<ol>\n<li>\ubcc0\uc218 <code>v<\/code>\uc758 \ud604\uc7ac \uac12\uc774 <code>old_val<\/code>\uacfc \uc77c\uce58\ud558\ub294\uc9c0 \ube44\uad50\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>\uc77c\uce58\ud55c\ub2e4\uba74<\/strong>: <code>v<\/code>\uc758 \uac12\uc744 <code>new_val<\/code>\ub85c \uad50\ud658\ud558\uace0 \uc131\uacf5(True \ub610\ub294 \uc774\uc804 \uac12)\uc744 \ubc18\ud658\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>\uc77c\uce58\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74<\/strong>: \ub2e4\ub978 \uc2a4\ub808\ub4dc\uac00 \uac12\uc744 \uc911\uac04\uc5d0 \ubc14\uafbc \uac83\uc73c\ub85c \ud310\ub2e8\ud558\uc5ec \uad50\ud658\ud558\uc9c0 \uc54a\uace0 \uc2e4\ud328(False)\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4.<\/li>\n<\/ol>\n<\/li>\n<li><strong>\ud575\uc2ec \ud3ec\uc778\ud2b8<\/strong>: \ube44\uad50\uc640 \uad50\ud658\uc774\ub77c\ub294 <strong>\ub450 \uac00\uc9c0 \uc791\uc5c5\uc774 \ub2e8 \ud558\ub098\uc758 \uc6d0\uc790\uc801 \uba85\ub839<\/strong>\uc73c\ub85c \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h4><code>atomic_cas<\/code> \ub3d9\uc791 \uac1c\ub150 (C\uc5b8\uc5b4 \uc288\ub3c4\ucf54\ub4dc)<\/h4>\n<pre><code class=\"language-c\">\/\/ \uc2e4\uc81c\ub85c\ub294 \uc774 \uc804\uccb4 \ub85c\uc9c1\uc774 CPU \ub0b4\ubd80\uc5d0\uc11c \ub2e8 \ud558\ub098\uc758 \uc6d0\uc790\uc801 \uba85\ub839\uc5b4\ub85c \uc2e4\ud589\ub428!\nbool atomic_cas(atomic_t *ptr, int expected_val, int new_val) {\n    if (*ptr == expected_val) {\n        *ptr = new_val;\n        return true;  \/\/ \uc131\uacf5\n    }\n    return false;     \/\/ \uc2e4\ud328 (\ub2e4\ub978 \uc2a4\ub808\ub4dc\uac00 \uc774\ubbf8 \uac12\uc744 \ubcc0\uacbd\ud568)\n}<\/code><\/pre>\n<hr \/>\n<h2>3. \uc2e4\uc804 \uc751\uc6a9: Lock-Free \ud328\ud134\uacfc Retry Loop<\/h2>\n<p><code>atomic_cas<\/code>\ub294 \ub2e8\ub3c5\uc73c\ub85c \uc0ac\uc6a9\ud558\uae30\ubcf4\ub2e4 \uc131\uacf5\ud560 \ub54c\uae4c\uc9c0 \ubc18\ubcf5\ud558\ub294 <strong>Retry Loop<\/strong> \uad6c\uc870\ub85c \ub9ce\uc774 \ud65c\uc6a9\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc608\ub97c \ub4e4\uc5b4, \uc5ec\ub7ec \uc2a4\ub808\ub4dc\uac00 \uacf5\uc720 \uce74\uc6b4\ud130\ub97c \uc548\uc804\ud558\uac8c \uc99d\uac00\uc2dc\ud0a4\ub824\uace0 \ud560 \ub54c Lock(Mutex) \uc5c6\uc774 \ub2e4\uc74c\uacfc \uac19\uc774 \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-c\">#include &lt;stdio.h&gt;\n#include &lt;stdbool.h&gt;\n\n\/\/ atomic \ubcc0\uc218 \uc120\uc5b8 \ubc0f \ucd08\uae30\ud654\nstatic atomic_t g_counter = ATOMIC_INIT(0);\n\n\/\/ Lock-Free \uce74\uc6b4\ud130 \uc99d\uac00 \ud568\uc218\nvoid safe_increment(void) {\n    int current_val;\n\n    do {\n        \/\/ 1. \ud604\uc7ac \uce74\uc6b4\ud2b8 \uac12\uc744 \uc77d\uc5b4\uc634\n        current_val = atomic_read(&amp;g_counter);\n\n        \/\/ 2. \ub0b4\uac00 \uc77d\uc740 current_val\uc774 \uc720\uc9c0\ub418\uace0 \uc788\ub2e4\uba74 current_val + 1\ub85c \uc5c5\ub370\uc774\ud2b8 \uc2dc\ub3c4\n        \/\/ \uc911\uac04\uc5d0 \ub2e4\ub978 \uc2a4\ub808\ub4dc\uac00 g_counter\ub97c \ubc14\uafd4\ubc84\ub838\ub2e4\uba74 atomic_cas\ub294 false\ub97c \ubc18\ud658\ud558\uace0 \ub8e8\ud504 \uc7ac\uc2dc\ub3c4\n    } while (!atomic_cas(&amp;g_counter, current_val, current_val + 1));\n}<\/code><\/pre>\n<hr \/>\n<h2>4. \uc694\uc57d \ubc0f \uc815\ub9ac<\/h2>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">\ud568\uc218\/\ub9e4\ud06c\ub85c<\/th>\n<th style=\"text-align: left;\">\uc8fc\uc694 \uae30\ub2a5<\/th>\n<th style=\"text-align: left;\">\uc8fc\uc694 \uc0ac\uc6a9\ucc98<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong><code>ATOMIC_INIT(val)<\/code><\/strong><\/td>\n<td style=\"text-align: left;\"><code>atomic_t<\/code> \ubcc0\uc218\ub97c \uc815\uc801\uc73c\ub85c \ucd08\uae30\ud654<\/td>\n<td style=\"text-align: left;\">\uc804\uc5ed\/static atomic \ubcc0\uc218 \uc120\uc5b8 \uc2dc<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>atomic_read(v)<\/code><\/strong><\/td>\n<td style=\"text-align: left;\">\uba54\ubaa8\ub9ac\uc5d0\uc11c \ubcc0\uc218 \uac12\uc744 \uc6d0\uc790\uc801\uc73c\ub85c \uc77d\uc74c<\/td>\n<td style=\"text-align: left;\">\uc0c1\ud0dc \uccb4\ud06c \ubc0f \uc870\uac74\ubb38 \uac80\uc0ac<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>atomic_set(v, i)<\/code><\/strong><\/td>\n<td style=\"text-align: left;\">\ubcc0\uc218\uc5d0 \uc0c8\ub85c\uc6b4 \uc815\uc218 \uac12\uc744 \uc6d0\uc790\uc801\uc73c\ub85c \uc800\uc7a5<\/td>\n<td style=\"text-align: left;\">\uc0c1\ud0dc \ub2e8\uc21c \ubcc0\uacbd \ubc0f \uc0c1\ud0dc \ud50c\ub798\uadf8 \uc124\uc815<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong><code>atomic_cas(v, old, new)<\/code><\/strong><\/td>\n<td style=\"text-align: left;\">\ubcc0\uc218 \uac12\uc774 <code>old<\/code>\uc640 \uac19\uc73c\uba74 <code>new<\/code>\ub85c \uad50\ud658<\/td>\n<td style=\"text-align: left;\"><strong>Lock-Free \uc54c\uace0\ub9ac\uc998<\/strong>, Spinlock \uad6c\ud604<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>\ub9c8\ubb34\ub9ac<\/h3>\n<p>Mutex\ub098 Semaphore\ub294 \uc548\uc804\ud558\uc9c0\ub9cc \uc2a4\ub808\ub4dc\uac00 \ub300\uae30 \uc0c1\ud0dc(Blocked)\ub85c \uc804\ud658\ub418\ub294 \ube44\uc6a9\uc774 \ubc1c\uc0dd\ud569\ub2c8\ub2e4. \ubc18\uba74, \uac04\ub2e8\ud55c \uc0c1\ud0dc \ud50c\ub798\uadf8\ub098 \uce74\uc6b4\ud130 \uad00\ub9ac \uc2dc <strong>Atomic \uc5f0\uc0b0 (<code>ATOMIC_INIT<\/code>, <code>atomic_read<\/code>, <code>atomic_set<\/code>, <code>atomic_cas<\/code>)<\/strong>\uc744 \ud65c\uc6a9\ud558\uba74 \ub3d9\uae30\ud654 \uc624\ubc84\ud5e4\ub4dc\ub97c \ucd5c\uc18c\ud654\ud558\uba74\uc11c\ub3c4 \uc644\ubcbd\ud55c Thread-Safety\ub97c \ud655\ubcf4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <\/p>\n<p>\uc784\ubca0\ub514\ub4dc \ub4dc\ub77c\uc774\ubc84 \uac1c\ubc1c\uc774\ub098 \uace0\uc131\ub2a5 \uba40\ud2f0\uc2a4\ub808\ub4dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc124\uacc4\ud560 \ub54c Atomic \uc5f0\uc0b0\uc758 \ub9e4\ucee4\ub2c8\uc998\uc744 \uaf2d \uc219\uc9c0\ud558\uace0 \uc801\uc808\ud788 \ud65c\uc6a9\ud574\ubcf4\uc138\uc694!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>C\/C++ \uba40\ud2f0\uc2a4\ub808\ub4dc\uc640 \uc784\ubca0\ub514\ub4dc \ucee4\ub110 \ud504\ub85c\uadf8\ub798\ubc0d\uc758 \ud575\uc2ec: Atomic \uc5f0\uc0b0 \uc644\ubcbd \uc815\ub9ac (ATOMIC_INIT, atomic_read, atomic_set, atomic_cas) \uba40\ud2f0\uc2a4\ub808\ub4dc(Multi-threaded) \ud658\uacbd\uc774\ub098 \uc784\ubca0\ub514\ub4dc RTOS \/ Linux \ucee4\ub110 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \uc9c4\ud589\ud560 \ub54c \uac00\uc7a5 \ud754\ud788 \uc811\ud558\uac8c \ub418\ub294 \ubb38\uc81c \uc911 \ud558\ub098\uac00 \ubc14\ub85c \uacbd\ud569 \uc870\uac74(Race Condition)\uc785\ub2c8\ub2e4. \uc5ec\ub7ec \uc2a4\ub808\ub4dc\ub098 \uc778\ud130\ub7fd\ud2b8 \ud578\ub4e4\ub7ec\uac00 \ub3d9\uc2dc \ub2e4\ubc1c\uc801\uc73c\ub85c \uac19\uc740 \uba54\ubaa8\ub9ac \uacf5\uac04\uc744 \uc77d\uace0 \uc4f8 \ub54c \ubc1c\uc0dd\ud558\uba70, \uc774\ub294 \uc608\uce21\ud560 \uc218 \uc5c6\ub294 \ubc84\uadf8\uc640 \uc2dc\uc2a4\ud15c \ubd95\uad34\ub97c\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=11804\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[],"class_list":["post-11804","post","type-post","status-publish","format-standard","hentry","category-devops"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11804","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=11804"}],"version-history":[{"count":1,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11804\/revisions"}],"predecessor-version":[{"id":11805,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/11804\/revisions\/11805"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=11804"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=11804"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=11804"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}