티스토리 뷰

IT지식

std::thread 와 std::atomic 사용하기

민자르 2017. 1. 24. 10:30
반응형

먼저 간단한 샘플 코딩을 해본다.


#include <iostream>

#include <thread>


int g_int;


void addFun1()

{

while ( g_int < 20 )

{

g_int++;

printf"addFun1 %d\n", (int)g_int );

}

}


void addFun2()

{

while ( g_int < 20 )

{

g_int++;

printf"\taddFun2 %d\n", (int)g_int );

}

}


int main(int argc, const char * argv[])

{

srand((unsigned int)clock());

Game game;

game.init();

game.Result();

g_int = 0;

std::thread fun1 = std::thread( &addFun1 );

std::thread fun2 = std::thread( &addFun2 );

if ( fun1.joinable() )

{

fun1.join();

}

if ( fun2.joinable() )

{

fun2.join();

}


    return 0;

}


결과

addFun1 1

addFun1 2

addFun1 3

addFun1 4

addFun1 5

addFun1 6

addFun1 7

addFun1 8

addFun1 9

addFun1 10

addFun1 11

addFun1 12

addFun1 13

addFun1 14

addFun1 15

addFun1 16

addFun1 17

addFun1 18

addFun1 19

addFun1 20

Program ended with exit code: 0


위 결과를 보면 이상한 점을 알 수 있다. 오직 addFun1 함수만 실행된듯한 느낌이 든다.

이를 해결하기 위해서는 공유하고 있는걸 std::mutex를 해야 한다. 


코드를 수정해본다.


#include <iostream>

#include <thread>


std::atomic<int> g_int;


void addFun1()

{

while ( g_int < 20 )

{

g_int++;

printf"addFun1 %d\n", (int)g_int );

}

}


void addFun2()

{

while ( g_int < 20 )

{

g_int++;

printf"\taddFun2 %d\n", (int)g_int );

}

}


int main(int argc, const char * argv[])

{

srand((unsigned int)clock());

Game game;

game.init();

game.Result();

g_int = 0;

std::thread fun1 = std::thread( &addFun1 );

std::thread fun2 = std::thread( &addFun2 );

if ( fun1.joinable() )

{

fun1.join();

}

if ( fun2.joinable() )

{

fun2.join();

}


    return 0;

}


결과

addFun1 1

addFun2 2

addFun1 3

addFun2 4

addFun1 5

addFun2 6

addFun1 7

addFun2 8

addFun1 9

addFun2 10

addFun1 11

addFun2 12

addFun1 13

addFun2 14

addFun1 15

addFun2 16

addFun1 17

addFun2 18

addFun1 19

addFun2 20

Program ended with exit code: 0


위 결과를 보면 알 수 있듯이 함수 두개가 반복적으로 사이좋게 하나씩 실행되는걸 볼 수 있다.

위와 같이 해야 원하는 결과를 얻을 수 있다. 첫번째 코드와 두번째 코드의 차이는


int g_int;    ->     std::atomic<int> g_int;


한 줄만 수정한 것이다. 만일 std::atomic 사용하지 않는다면 std::mutex를 사용해야 한다.

하지만 변수 하나 정도는 일일이 그렇게 사용하는 것보다 위와 같이 std::atomic 사용하는게 좋은 것 같다.

728x90
반응형
댓글