소프트웨어

[c++] 스택에 저장된 곳을 다른 함수가 주소를 받아서 사용할 수 있을까?

개발자_이훈규 2014. 2. 14. 12:10

1.

코드로 실험해보기로 한다.



2.


아래 코드와 같다.



#include <stdio.h>                                                              

#include <pthread.h>                                                            

                                                                                

void pass(pthread_mutex_t *pMutex) {                                            

                                                                                

    printf("pass : %p\n", pMutex);                                              

                                                                                

}                                                                               

                                                                                

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

                                                                                

    pthread_mutex_t m_mutex;                                                    

    printf("main : %p\n", &m_mutex);                                            

                                                                                

    pass(&m_mutex);                                                             

                                                                                

    return 0;                                                                   

} 



결과

main : 0xbf9a5d64

pass : 0xbf9a5d64


두개가 동일한 주소를 가리키고 있다.



3. 
그러면 조작도 가능할까?


#include <stdio.h>                                                              

#include <pthread.h>                                                            

                                                                                

void pass(pthread_mutex_t *pMutex) {                                            

                                                                                

    printf("pass : %p\n", pMutex);                                              

    pthread_mutex_unlock(pMutex);                                               

                                                                                

}                                                                               

                                                                                

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

                                                                                

    pthread_mutex_t m_mutex;                                                    

    printf("main : %p\n", &m_mutex);                                            

                                                                                

    pthread_mutex_lock( &m_mutex);                                              

    pass(&m_mutex);                                                             

                                                                                

    return 0;                                                                   

} 


이것도 위와 동일하게 잘 작동한다.

그러면 함수에 할당한 후 사용해보자.



4.


할당 한 후에 사용하는것이 가능할까, 

아래의 경우에선 잘 끝났다. 하지만! 한번  lock을 두번 걸어서 deadlock상황을 만들어보자. 이래야 두개가 동일한 값을 가리키고 있다는게 확실하니깐.

#include <stdio.h>                                                              

#include <pthread.h>                                                            

                                                                                

void pass(pthread_mutex_t *pMutex) {                                            

                                                                                

    pthread_mutex_t *p_mutex;                                                   

                                                                                

    p_mutex = pMutex;                                                           

    printf("pass : %p\n", p_mutex);                                             

    pthread_mutex_unlock(p_mutex);                                              

                                                                                

}                                                                               

                                                                                

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

                                                                                

    pthread_mutex_t m_mutex;                                                    

    printf("main : %p\n", &m_mutex);                                            

                                                                                

    pthread_mutex_lock( &m_mutex);                                              

    pass(&m_mutex);                                                             

                                                                                

    return 0;                                                                   

} 



5.

두개의 lock을 걸었는데 잘 끝난다.. 망했다. 확인해봐야한다.

어쨋든 내 예상이 맞았다. 내 프로그램에 이 부분이 에러였다.


#include <stdio.h>                                                              

#include <pthread.h>                                                            

                                                                                

void pass(pthread_mutex_t *pMutex) {                                            

                                                                                

    pthread_mutex_t *p_mutex;                                                   

                                                                                

    p_mutex = pMutex;                                                           

    printf("pass : %p\n", p_mutex);                                             

    pthread_mutex_lock(p_mutex);                                                

                                                                                

}                                                                               

                                                                                

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

                                                                                

    pthread_mutex_t m_mutex;                                                    

    printf("main : %p\n", &m_mutex);                                            

                                                                                

    pthread_mutex_lock( &m_mutex);                                              

    pass(&m_mutex);                                                             

                                                                                

    return 0;                                                                   

} 



6.

아니다. main에서 lock을 두번 연속으로 하니깐 잘 끝나더라. 결론은 아무 이상 없다.


ps. 나중에 발견한건데 이 부분은 문제가 없고 multi thread의 create되어 시작되는 부분이 문제가 생긴거였다.