어찌보면 당연한 얘기이긴 한데...예부터 보자
(돌려보진 않고 막 짠 코드)

void* testFunc(void* arg) {

...

}


int main() {

pthread_t p_thread[5];

int status[5];

int arg[5] = { 0, 1, 2, 3, 4 };

for (int i = 0; i < 5; i++) {

int thread_id = pthread_create(&p_thread[i], NULL, testFunc, (void *)(&(arg[i])));

}

for (int i = 0; i < 5; i++) {

pthread_join(p_thread[i], reinterpret_cast<void **>(&status[i]));

}

64bit에서는 요런식으로 pthread_join을 하게 되면 status가 4byte인 포인터를 넘겨주었는데
이대로 실행을 하게 되면 pthread_join()내부에서 8byte의 값으로 덮어쓰게 된다.
따라서 stack corrupted 오류가 발생하거나, 이상한 값이 들어올 수 있당

따라서 status를 8byte인 long long같은 형식으로 정의하면 된당

C++에서 32비트와 64비트를 #ifdef를 사용해서 정의하는 방법을 설명

결국 리눅스와 윈도우를 한꺼번에 가져갈 수는 없구만...

http://stackoverflow.com/questions/1505582/determining-32-vs-64-bit-in-c

허망하도다 -_-;

모르는걸 어째? 알면 되지 ㅋㅋㅋ


http://stackoverflow.com/questions/20669108/how-to-get-8-byte-pointer-value-on-64-bit-machine-on-gdb

#pragma once

처음 솔루션을 만들면 stdafx.h 헤더파일 앞에 붙어있다.

이 명령이 없다면 컴파일을 할 때 여러군데에서 이 헤더파일을 include하고 있을 때, 매번 define 되어 중복 정의 되었다는 오류가 발생하게 된다. 이 경우 중복 정의 되지 않고 한번만 컴파일을 한번만 하게 해주는 명령이다.

중복 정의되는 것을 막기 때문에 컴파일 시간도 줄어들게 된다. 따라서 대부분의 헤더파일에 #pragma once명령을 삽입하는 것을 권장한다.

또한, #pragme는 컴파일러에 직접 명령을 전달하기 위해 사용한다고 한다.


회사에 들어와서 처음부터 다시 C++공부하느라 정신이 한개도 없다...

뭐 이런 기본적인 내용도 몰랐나 싶고 뭐 그렇다 ㅠㅠㅠㅠㅠ

+ Recent posts