티스토리 뷰
먼저 간단한 샘플 코딩을 해본다.
#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 사용하는게 좋은 것 같다.