pthread - whdlgp/system_programming_pra GitHub Wiki
๋ญ ๋งํ์๋ฉด ํ์ค ์ฐ๋๋. ์ ๋์ค ๊ณ์ด ์ด์์ฒด์ ์์๋ ํฌํจ๋๋ค๊ณ ํ๋ค. ์๋์ฐ์ฆ ์ฉ์ผ๋ก๋ ์๋ค๊ณ ํ๋๋ฐ, ์จ๋ณธ์ ์ ์๋ค.
๊ทธ๋์ RTOS๋ฅผ ์ฐ๋ฉด์, ์ฐ๋๋๋ ๋ฌดํ๋ฃจํ๋ฅผ ํฌํจํด์ผ ํ๋ค๋ ์๊ฐ์ ๊ฐ์ง๊ณ ์์๋๋ฐ, POSIX thread ๋ํ ๋ฌดํ๋ฃจํ๋ ํ์๊ฐ ์๋ ๋ชจ์์ด๋ค. ์ฝ๊ฐ ๊ดด๋ฆฌ๊ฐ์ด ์๊ธด ํ์ง๋ง ์ผ๋ฐ ํ์จ์ด ๋ ๋ฒจ์์๋ main๋ด๋ถ์ ๋ฌดํ๋ฃจํ๊ฐ ์๋๊ฑธ ์๊ฐํ๋ฉด ์ดํด๋ ๋๋ค.
pthread_create(์ฐ๋๋ ID๋ฅผ ์ ์ฅํ ๋ณ์ ํฌ์ธํฐ, ์์ฑ, ๋๋ฆด ํจ์(๋ด์ฉ๋ฌผ), ์ฐ๋๋์ ๋๊ฒจ์ค ์ธ์);
- ์ฒซ๋ฒ์งธ ์ธ์ : ์ฐ๋๋์ ID๋ฅผ ์ ์ฅํ ๋ณ์์ ํฌ์ธํฐ ๊ฐ์ด ๋ค๋ฆฌ์ด๊ฐ๋ค. ๋ณ์๋ pthread_t ๋ก ์ ์ธํ๋ฉด ๋๋ค.
- ๋๋ฒ์งธ ์ธ์ : ์์ฑ๊ฐ์ด ๋ค์ด๊ฐ๋๋ฐ, ์ฃผ๋ก NULL๊ฐ์ด ๋ค์ด๊ฐ๋ค.
- ์๋ฒ์งธ ์ธ์ : ์ฐ๋๋์์ ์คํ๋ ๋ด์ฉ๋ฌผ์ด ์์ฑ๋ ํจ์์ ํฌ์ธํฐ๋ฅผ ๋ฃ์ด์ค๋ค. ์ด๋ ํจ์์ ๋ฐํ๊ฐ์ void ํ์ด ์๋ void* ๋ค.
- ๋ด๋ฒ์งธ ์ธ์ : ์ฐ๋๋์์ ์คํํ ํจ์์์ ์ธ์๋ก ์ ๋ฌ๋๋ค.
์ ์์ ์ผ๋ก ์ฐ๋๋๊ฐ ์์ฑ๋๋ฉด 0์ ๋ฆฌํดํ๋ค.
pthread_exit(๋ฆฌํด๊ฐ);
์ฐ๋๋ ๋ด๋ถ์์ ์ฐ๋๋๋ฅผ ์ข ๋ฃํ ๋ ์ฌ์ฉํ๋ ํจ์๋ค. ๋ช๊ฐ์ง ํน์ง์ ๋ค๋ฉด
- ํธ์ถ๋ ์ฐ๋๋๋ง ์ข ๋ฃํ๋ค. ๋ค๋ฅธ ์ฐ๋๋์๋ ์ํฅ์ด ์๊ฐ๋ค.
- return๊ณผ ๋ค๋ฅด๊ฒ ๋์ ํ ๋น์ด ๋ด๋ถ์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
์ด๋ป๊ฒ ๋ณด๋ฉด main๋ฌธ๋ ํ๋์ ์ฐ๋๋๋ก ๋ณผ ์ ์๋ค. ์๋ก main์์ return์ผ๋ก ์ข
๋ฃ์ ๋ค๋ฅธ ์ฐ๋๋๋ค์ ๋ณ๋์ ์ธํฐ๋ฝํธ๋ฅผ ํธ์ถํ ์๊ฐ๋ ์์ด ์ข
๋ฃ๋๋ฒ๋ฆฐ๋ค. ๋๋ฌธ์ ๊ทธ๋ฐ๊ฑธ ๋ง๊ธฐ ์ํด pthread_exit๋ฅผ ์ด๋ค๊ณ ํ ์ ์๋ค.
return๊ณผ ๋ค๋ฅด๊ฒ ์ด๋๊ฐ ๋์ ํ ๋น์ ํ๋๋ฐ, ๋๋ ์ ํํ ๋ญ ๋์ ํ ๋น ํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค ใ
กใ
ก;. ์ด์จ๋ ์ฐ๋๋๋ฅผ ๋ง์ด ์์ฑํด๋ ์ด ๋์ ํ ๋น๋ ์ ์ฒด ์์ ๋ณํํ์ง ์๋๋ค๊ณ . ๊ทธ๋ฆฌ๊ณ ๋์ ํ ๋น์ ํด์ฌํ์ง ์๊ณ ๋จ๊ฒจ๋๋๋ฐ, ์ด์ฐจํผ ํ๋ก์ธ์ค๊ฐ ์ฃฝ์ผ๋ฉด ๋ค ์ ๋ฆฌ๋ ๊บผ๊ธฐ ๋๋ฌธ์ด๋๋ค.
(์ฒญ์ ์์ฃผ๋จธ๋๊ฐ ๋ฌผ ๋ด๋ ค์ฃผ์คํ ๋ ๋ด๊ฐ X์ ๋ด๋ฆด ํ์๊ฐ ์๋๊ฐ? ๋ผ๊ณ ์๊ฐํ๋๊ฑด๊ฐ,,,)
pthread_join(์ฐ๋๋ ID๋ฅผ ์ ์ฅํ ๋ณ์, ๋ฆฌํด๋ ๊ฐ์ ์ ์ฅํ ๋ณ์ ํฌ์ธํฐ);
fork๋ ์์ ํ๋ก์ธ์ค๋ฅผ waitpid๋ก ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ๊ณผ ๊ฝค ๋น์ทํ๋ค. ์ง์ ํ ์ฐ๋๋ ID๋ฅผ ๊ฐ์ง ์ฐ๋๋๊ฐ ์ข ๋ฃ๋๋๊ฒ์ ๊ธฐ๋ค๋ฆฐ๋ค. ๊ธฐ๋ค๋ฆฌ๋ ์ฐ๋๋ ์ชฝ์์ return ์ด๋ pthread_exit ํจ์๋ก ๋ฐํํ ๊ฐ์ ๋๋ฒ์งธ ์ธ์์ ๋ฃ์ด์ค ํฌ์ธํฐ์ ๋ณ์๊ฐ ๋๊ฒจ๋ฐ๋๋ค.
pthread_detach(์ฐ๋๋ ID๋ฅผ ์ง์ ํ ๋ณ์);
๋ง์ฝ ์ง์ ํ ์ฐ๋๋ ID๋ฅผ ๊ฐ์ง ์ฐ๋๋๊ฐ detached ์์ฑ์ด๋ผ๋ฉด main์ชฝ์์ ์ฐ๋๋๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค. detached ์์ฑ์ ์ฐ๋๋๋ detach ํธ์ถ์ด ๋๋ฉด, ์ฐ๋๋๋ฅผ ์ข
๋ฃํ ๋๊ฐ ๋์์ ๋ ์๊ธฐ๊ฐ ์์์ ๋ชจ๋ ์์์ ํด์ ํ๋ค. (์์ ๋ฐฉ์์ฃผ์?)
๋ง์ ์ฐ๋ ค๋ ์ด๊ฑด ๋ณ๋ก ์ฐ์ง ์๋๊ฒ ๊ฐ๊ธฐ๋,,,
์ด์ ๋๋ง ์์๋ ์ฐ๋๋์ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ์๋ ๊ฒ์ด ์๋๊น. ๋ช๊ฐ์ง ์์ ๋ก ์ข ์ต์ํด์ ธ ๋ณด๊ธฐ๋ก ํ์.
๋์ถฉ ๋ค์๊ณผ ๊ฐ์ด ์ฐ๋ฉด ๋๋ค. ๋๊ฒจ์ค ์ธ์๊ฐ ์ ์ 5๋ผ๋ฉด,
#include <pthread.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
void *thread(void* data);
int main(void)
{
pthread_t threads[5];
int rc, t;
for(t = 0; t < 5; t++)
{
printf("In main: creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, thread, (void*)&t);
sleep(1); //์ฐ๋๋์ชฝ์์ ์ธ์๋ฅผ ๋ฐ์ ์๊ฐ์ ์ถฉ๋ถํ ์ฃผ๊ธฐ
if(rc) //์๋ฌ์ฒ๋ฆฌ
{
printf("Thread creation error!\n");
exit(1);
}
}
pthread_exit(NULL);
return 0;
}
void *thread(void* data)
{
int id = *(int*)data;
sleep(id);
static int cnt = 0;
//printf("Hello I'm thread number %d \n", id);
printf("Hello I'm thread number %d, (cnt = %d)\n",id, cnt++);
pthread_exit(NULL);
}
์ ์์ ์์๋ ์๋ก๋ค๋ฅธ 5๊ฐ์ ์ฐ๋๋๊ฐ ๊ฐ์ ๋ด์ฉ์ ์ผ์ ํ๋๋ก ํ์๋ค. ์์ฑ๊ฐ์ ์ด์ง๊ฐํด์ ๋ฐ๊ฟ ์ผ์ด ์์๊ธฐ ๋๋ฌธ์ NULL ๊ฐ์ผ๋ก ์์ฑ์ ํ๋ค.
์ฐ๋๋์ ์ธ์๊ฐ ์ ๋ฌ๋ ๋ ์ฝ๊ฐ์ ์๊ฐ์ ์ฃผ์ด์ผ ํ๋ค๊ณ ํ๋ค. ์๊ทธ๋ฌ๋ฉด ์ ๋๋ก ์ ๋ฌ์ด ์๋๋ค๊ณ ,,,
In main: creating thread 0
Hello I'm thread number 0, (cnt = 0)
In main: creating thread 1
In main: creating thread 2
Hello I'm thread number 1, (cnt = 1)
In main: creating thread 3
In main: creating thread 4
Hello I'm thread number 2, (cnt = 2)
์คํํด๋ณด๋ฉด ์ธ์๊ฐ ์ ๋๋ก ์ ๋ฌ ๋จ์ ํ์ธํ ์ ์๋ค.
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void* thread(void* data)
{
int num = *(int*)data;
printf("num %d\n", num);
sleep(10);
return (void*)(num*num);
}
int main(void)
{
pthread_t th;
int tid;
int status;
int a = 100;
tid = pthread_create(&th, NULL, thread, (void*)&a);
pthread_join(th, (void*)&status);
printf("Thread join: %d\n", status);
return 0;
}
์ด๋ฒ์ ๊ฐ๋จํ ์์ ์ pthread_join์ ์ด์ฉํด๋ดค๋ค. ์์ฑ๋๋ฉด์ ์ธ์๋ก 100์ ๋๊ฒจ๋ฐ๊ณ , 100*100์ ํ์ฌ returnํ๋ค.
์ด๋ฒ์ pthread_exit๋ฅผ ์ด์ฉํ์ง ์์๋๋ฐ, ์ด์ฉํ์ง ์์๋ ๋ฐํ์ด ์ ๋๋๊ฒ์ ํ์ธํ ์ ์์๋ค. ์ฑ๋ฅ ์ฐจ์ด๊ฐ ํฌ๊ฒ ๋๋์ง๋ ๋ชจ๋ฅด๊ฒ ๊ณ ,,, ์ฐ๋๋๋ฅผ ์ฌ๋ฌ๊ฐ ์์ฑํ๋ฉด ๋๊ปด์ง ์ง ๋ชจ๋ฅด๊ฒ ๋ค.
return๋ ๊ฐ์ pthread_join์ ์ด์ฉํด์ status ๋ผ๋ ๋ณ์์ ์ ์ฅํ printf๋ก ์ถ๋ ฅํ๋ค.
num 100
Thread join: 10000
์์ pthread_create ์ ์์ฑ ์๋ฆฌ์ NULL๊ฐ์ ๊ธฐ๋ณธ์ด๋ผ๊ณ ํ๋๋ฐ, ์์ฑ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์์ฑ์ ๋ค์ ๋๊ฐ์ง๊ฐ ์๋ค.
- PTHREAD_CREATE_JOINABLE
- PTHREAD_CREATE_DETACHED
NULL์ ๋ฃ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ JOINABLE์ด๋ค. ๊ทธ ์ด์ธ์ ์์ฑ๋ ์๋๋ฏ ํ์ง๋ง(์ ์ ๋ชจ๋ ์ฐ๋๋์ธ์ง ์ปค๋ ๋ชจ๋ ์ฐ๋๋์ธ์ง ๋ฑ๋ฑ,,,), ๊ตณ์ด ์์ฑ์ ๋ฐ๊ฟ ํ์๊ฐ ์๋ค๋ฉด ์๋ง ์์ ์์ฑ์ ์ฃผ๋ก ๋ฐ๊พธ์ง ์์๊น.
pthread_attr_init(์์ฑ ์๋ฃํ ํฌ์ธํฐ)
์ฌ๊ธฐ์ ์๋ฃํ์ด๋ผ๊ณ ํ ๊ฒ์ด, ์ ๊ธฐ ์๋ฆฌ์ ์์ฑ ์ ๋ณด์ ๊ตฌ์กฐ์ฒด๊ฐ ๋ค์ด๊ฐ๋๋ฐ, ์๋ฌด๋๋ ๊ฐ์ฒด๋ก๋ ๋ณด๋ ๊ฒ ๊ฐ๋ค(์์ฑ๊ฐ์ฒด ๋ผ๊ณ ํ๋ค ์นด๋๋ผ). ์จ๋ ์ธ์๋ก๋ pthread_attr_t ๋ผ๋ ์๋ฃํ์ ์ด์ฉํ๋ค. ์ด์ฉํ ๋
pthread_attr_t attr;
pthread_attr_init(&attr);
์ ์ฒ๋ผ ์ด์ฉํ๋ฉด ๋๋ค.
๋ค๋ฅธ ์์ฑ ํจ์(scope ๊ด๋ จ ์ปค๋ ๋ชจ๋์ธ์ง ๋ฑ๋ฑ,,,)๋ ์๋๋ฐ, ์ฌ๊ธฐ์๋ pthread_attr_setdetachstate ๋ผ๋ ํจ์๋ฅผ ์ธ๊ธํ ๊ฒ์ด๋ค.
pthread_attr_setdetachstate(์์ฑ ์๋ฃํ ํฌ์ธํฐ, ์์ฑ์ด๋ฆ)
์์ฑ์ joinable ์ธ์ง detached ์ธ์ง ์ค์ ํ ์ ์๋ ํจ์๋ค. ์ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ด ์ด๊ธฐํ์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋๋ค.
pthread_attr_t attr;์ฉ
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
PTHREAD_CREATE_JOINABLE
- pthread_join ํจ์์ ๊ฐ์ด ์ด์ฉํ๋ค.
- joinable ์์ฑ์์ pthread_join ํธ์ถ์ ์ฐ๋๋๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ค๋ค.
PTHREAD_CREATE_DETACHED
- pthread_detach ํจ์์ ๊ฐ์ด ์ด์ฉํ๋ค.
- detached ์์ฑ์์ pthread_detach ํธ์ถ์ ์ฐ๋๋๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค.
- ์ฐ๋๋๋ ์๊ธฐ๊ฐ ๋๋๋ฉด ์์์ ์์์ ๋ชจ๋ ํด์ ํ๋ค.
์์ ์์ฑ ์ค์ ๊น์ง ํ ํ pthread_create๋ฅผ ์ด์ฉํด ์ฐ๋๋๋ฅผ ์์ฑํ๋ฉด, ๋์ด์ ์์ฑ๊ฐ์ฒด๋ ํ์๊ฐ ์์ด์ง๋ค.
pthread_attr_destroy(์์ฑ ์๋ฃํ ํฌ์ธํฐ)
์์ฑ๊ฐ์ฒด attr์ด ์๋ค๋ฉด, ์ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ด ํ๋ฉด ๋๋ค.
pthread_attr_destroy(&attr);
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
void* work(void *null)
{
int i;
double result = 0.0;
for(i = 0; i < 100000; i++)
result +=(double)random();
printf("result = %e\n", result);
pthread_exit((void*)0);
}
int main(void)
{
pthread_t thread[3];
pthread_attr_t attr;
int rc, t;
void* status;
pthread_attr_init(&attr); //์์ฑ๊ฐ์ฒด ์์ฑ
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); //joinable๋ก ์์ฑ ์ค์
for(t = 0; t < 3; t++)
{
printf("Creating thread %d\n", t);
rc = pthread_create(&thread[t], &attr, work, NULL);
}
pthread_attr_destroy(&attr); //์์ฑ์ ๊ฑฐ
for(t = 0; t < 3; t++)
{
rc = pthread_join(thread[t], &status);
printf("Completed join with thread %d status = %ld\n", t, (long)status);
}
pthread_exit(NULL);
return 0;
}
Creating thread 0
Creating thread 1
Creating thread 2
result = 1.073075e+14
Completed join with thread 0 status = 0
result = 1.075923e+14
Completed join with thread 1 status = 0
result = 1.072782e+14
Completed join with thread 2 status = 0
์ฌ์ค joinable ์ ๊ธฐ๋ณธ ์ค์ ์ด๊ธฐ ๋๋ฌธ์ ๊ตณ์ด ๋ณ๋๋ก ์ค์ ํ ํ์๋ ์์ง๋ง, ์ฐ์ต์ผ์ ํ๋ฒ ์ค์ ์ ํด๋ดค๋ค.
joinable๋ก ์ฐ๋๋ ์์ฑํ, ๊ฐ ์ฐ๋๋๋ ๋๋คํ ๊ฐ์ ์ญ๋ง๋ฒ ๋ํ ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
๋ฉ์ธ ๋ฌธ์์๋ ์ฐ๋๋ 0๋ฒ ๋ถํฐ 2๋ฒ๊น์ง ์์๋๋ก ๋๋ ๊ฒ์ ๊ธฐ๋ํ๊ณ pthread_join์ ํ๋ค.
์ฐ๋๋๊ฐ์ ์๋ก ๊ณต์ ํ๋ ์์์ด ์๋ค. ๊ทผ๋ ์ด ๊ณต์ ์์์ ์์ ์ ํ๊ณ ์๋๋ฐ, ๊ฐ๋ ๋ค๋ฅธ ์ฐ๋๋๊ฐ ์น๊ณ ๋ค์ด์์ ์ด์ํ ์ง์ ํ๊ณ ๊ฐ๋ค. ๊ทธ๋ฐ๊ฑธ ๋ฐฉ์งํ๊ธฐ ์ํ ๋ฎคํ ์ค๋ค. ๋ค๋ฅธ RTOS ์์๋ ๋ฎคํ ์ค๋ ์ธ๋งํฌ์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ต์ํ๋ค.
pthread_mutex_init(๋ฎคํ
์ค ์๋ฃํ ํฌ์ธํฐ, ์์ฑ)
์ฌ๊ธฐ์๋ ๋ฎคํ ์ค๊ฐ์ฒด ๋ผ๊ณ ํ๋๋ฐ, c์์ ๊ฐ์ฒด๋ผ๊ณ ํ๋ ์ข ์ด์ํ ๋๋๋ ๋ ๋ค(๊ฐ์ฒด๋ผ๋๊ฒ ๊ฐ๋ ์ ์ธ๊ฑฐ๋ ๋ญ,,,). ์๋ฃํ์ด pthread_mutex_t์ธ ๊ตฌ์กฐ์ฒด(๊ฐ์ฒด๋ผ๊ณ ํด์ผํ๋,,,)๋ฅผ ์ฌ์ฉํ๋ค. ์์ฑ์ ๋ค๋ฅธ ์์ฑ์ด ์๋ค๋๊ฒ ๊ฐ์๋ฐ, ์ด์ฐจํผ ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ ๋ง๋๋ ๊ฒ์์๋ง ์ฐ๊ธฐ ๋๋ฌธ์,,, ๊ธฐ๋ณธ ๋ชจ๋์ธ fast ๋ชจ๋๋ง ์ฌ์ฉํ ๊ฒ ๊ฐ๋ค. ๊ธฐ๋ณธ ๋ชจ๋๋ก ์ฌ์ฉํ ๋ ค๋ฉด ์์ฑ์ NULL๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
pthread_mutex_t ๋ก ์ ์ธ๋ ๋ณ์๋ ์ ์ญ๋ณ์๋ก ์ฌ์ฉํด์ผ ํ๋ค. ์๋ํ๋ฉด ์ฐ๋๋ ํจ์ ๋ด๋ถ์์๋ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์,,,
์ฌ์ฉ์
pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);
๊ณผ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ๋๋ค.
pthread_mutex_destroy(๋ฎคํ
์ค ์๋ฃํ ํฌ์ธํฐ)
์์ ํ ์ฐ๋๋๊ฐ ๋ชจ๋ ๋๋๊ณ , ๋ฎคํ ์ค๊ฐ ๋์ด์ ์ธ๋ชจ ์์๋ ์ง์ฐ๋ ์ญํ ์ด๋ค. ๋ฑํ ๋ ์ธ๊ธํ ๊ฒ ์๋๊ฒ ๊ฐ๋ค.
pthread_mutex_destroy(&mutex);
์ฌ์ฉ๋ฒ๋ ๋ญ,,,
pthread_mutex_lock(๋ฎคํ
์ค ์๋ฃํ ํฌ์ธํฐ)
pthread_mutex_unlock(๋ฎคํ
์ค ์๋ฃํ ํฌ์ธํฐ)
๋ฎคํ ์ค๋ก ํฌ๋ฆฌํฐ์ปฌ ์น์ ๋ง๋๋๊ฑด ํฌ๊ฒ ์ด๋ ต์ง ์๋ค. ๋ฎคํ ์ค๊ฐ ๋ญ์ง๋ง ์์๋ ์ดํด๊ฐ ๋ ๊ฒ์ด๋ค. ์ด๋ค ๊ฐ์ด ์๋๋ฐ, ์ํ๊ฐ '์ฌ์ฉ์ค'๊ณผ '์ฌ์ฉ์ํจ'์ด ์๋ค. ๋ง์ฝ ์ฌ์ฉ์ํจ ์ํ๋ผ๋ฉด ์ฌ์ฉ์ ์ํด lock์ ๊ฑธ์ด ์ฌ์ฉ์ค์ผ๋ก ๋ฐ๊พผ๋ค. ์ฌ์ฉ์ด ๋๋๋ฉด unlock ํด์ ์ฌ์ฉ์ํจ์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
๋ง์ฝ val ์ด๋ ๋ณ์๋ฅผ ์ฐ๋๋๊ฐ์ ๊ณต์ ํ๊ณ , ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ ๋ง๋ค์ด ๋ณ๊ฒฝํด์ผ ํ๋ค๋ฉด
pthread_mutex_lock(&mutex);
val++;
pthread_mutex_unlock(&mutex);
์ด์ ๊ฐ์ด lock๊ณผ unlock ์ฌ์ด์ ๋ณ๊ฒฝํ ๊ฒ๋ค์ ๋ผ์ ๋ฃ์ผ๋ฉด ๊ทธ๋ง.
#define NITERS 100000000
#include <stdio.h>
#include <pthread.h>
unsigned int cnt = 0;
void* count(void *data);
pthread_mutex_t mutex; //๋ฎคํ
์ค ๊ฐ์ฒด ์์ฑ
int main(void)
{
pthread_t tid1, tid2;
pthread_mutex_init(&mutex, NULL); //๋ฎคํ
์ค ์ค์ ์ด๊ธฐํ
pthread_create(&tid1, NULL, count, NULL);
pthread_create(&tid2, NULL, count, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_mutex_destroy(&mutex); //๋ฎคํ
์ค ์ค์ ์ญ์
if(cnt != (unsigned)NITERS*2)
{
printf("BOOM! cnt = %d\n", cnt);
}
else
{
printf("OK! cnt = %d\n", cnt);
}
return 0;
}
void* count(void* data)
{
int i;
for(i = 0; i < NITERS; i++)
{
pthread_mutex_lock(&mutex);
cnt++;
pthread_mutex_unlock(&mutex);
}
}
์ฐ๋๋ ๋๊ฐ๋ฅผ ๋ง๋ค์ด cnt๋ผ๋ ์ ์ญ๋ณ์์ ๊ฐ๊ฐ NITERS(100000)๋งํผ ๋ํ๋ ๊ฐ๋จํ ์์ ๋ค. ์ฐ๋๋ ๋๊ฐ๊ฐ ๊ฐ๊ฐ ๋ํ๊ณ ์์ผ๋ฏ๋ก ๊ฒฐ๊ณผ๋ NITERS์ ๋๋ฐฐ์ ํด๋นํ๋ ๊ฐ์ด ๋์์ผ ํ๋ค. ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค๋ฉด ์ํธ๋ฐฐ์ ๊ฐ ์๋์ด ์์๊ฐ ๊ผฌ์ฌ ์ ๋๋ก ๋๋ฐฐ๊ฐ ์๋๋ค.
๋ฎคํ ์ค๋ฅผ ์ฌ์ฉ ์ํ์๋, ๊ณ์ฐ์ ๋นจ๋ฆฌ ๋๋ฌ์ง๋ง ์๊พธ ์ด์ํ ๊ฒฐ๊ณผ๊ฐ์ด ๋์๋ค. ์ด์ ๋ธ๋ฆฌ์ด ๋ ๋ฒจ๋ก ๋ค์ด๊ฐ์ ํ์ธํด๋ณด๋ฉด ์ ๊ทธ๋ฐ์ง ์ดํดํ ์ ์๋๋ฐ, ๊ทธ๋ฅ ์ค๋ช ํด๋ณด๊ธฐ๋ก ํ์. cnt++์ ํด๋นํ๋ ๋ด์ฉ์ด ๋์ถฉ ์๋๊ฐ์ ์์๋ฅผ ๊ฐ์ง ๊ฒ์ด๋ค.
- cnt์ ๊ฐ์ ๋ ์ง์คํฐ์ ๋ณต์ฌ
- ๋ ์ง์คํฐ์์ ๊ฐ์ 1๋ํจ
- ๊ทธ ๊ฐ์ ๋ค์ cnt์ ๋ณต์ฌ
๋ญ ์ด๋ฐ ์์๋ค. ์ด์
๋ธ๋ฆฌ์ด๋ฅผ ๋์ดํ๋ผ๊ณ ํ๋ฉด ์,,, (๊ตฐ์ํ๋ก ๋น ๊ฐ๋ ๋จธ๋ฆฌ๋ก ๊ณผ์ฐ ์ด์
๋ธ๋ฆฌ์ด๋ฅผ ๋ณด๊ณ ๋๋ ค์น์ง ์์ ์ ์์๊น?)
์จ๋ ๋ณต์ฌํ๊ณ ๋ณต์ฌํ๋ ๊ณผ์ ์์ ๋ค๋ฅธ ์ฐ๋๋๊ฐ ์น๊ณ ๋ค์ด์์ ๋ณ๊ฒฝํด๋ฒ๋ฆฌ๋ฉด ๋น์ฐํ ์ด์ํ ๊ฐ์ด ๋๋ฒ๋ฆด๊ฑฐ๋ค. ๊ทธ๋์ ๋ฎคํ
์ค๊ฐ ํ์ํ๋ค.
(์์ด์ ์ ์ญ๋ณ์๋ฅผ ์ฌ์ฉํ๋๊ฒ ๋ง์์ ์๋ค๊ธด ํ์ง๋ง ใ
กใ
ก;)
์ ์์ค๋๋ก ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ ์ข ํฌ๊ฒ ๋จ์ด์ง๊ธด ํด๋ ์ ์์ ์ธ ์ถ๋ ฅ์ ๋์จ๋ค. for๋ฌธ ๋ฐ์ ๋๋ฉด ์ข ๋ ๋นจ๋ฆฌ์ง๊ธด ํ๊ฒ ์ง.