버그 해결을 위한 모든 질문을 던져
0 votes
423 views
한 쓰레드에서 쓰기만 하고 다른 쓰레드에서 읽기만 하는 경우엔 쓰레드 세이프한게 맞나요?

(동기가 정확하게 맞을 필요는 없음)

 

class Foo
{
    int _a;

    void Thread_1()
    {
        if (_a == 10)
            Do1();
    }

    void Thread_2()
    {
        while(true)
        {
            switch ( 시간)
            {
                case 10초:            _a = 10; break;
                case 1시간:            _a = 0;    break;
            }            
        }            
    }
}
asked (18 point) , 423 views

3 answers

0 votes
4바이트(x86), 8바이트(x64) 내의 데이터라면 그런 경우 thread-safe합니다. 따라서 저런 경우에는 굳이 동기화할 필요없습니다.
answered (185 point)
0 votes

보통 쓰레드 세이프 하냐 안하냐를 따지는 경우는 변수하나를 기준으로 얘기하는 경우는 없고요.

자료구조나 특정 클래스의 작동이 그러하냐 아니냐를 가지고 따지는 경우입니다.

예를 들어 아래의 링크 같은 경우요.

https://stackoverflow.com/questions/9042571/is-stdvector-or-boostvector-thread-safe

https://stackoverflow.com/questions/14482830/stdshared-ptr-thread-safety

answered (458 point)
0 votes
값 동기화를 물어보신다면 그렇지 않을수 있습니다.

 

A라는 쓰레드에서 쓰기만하고

B라는 쓰레드에서 읽기만 한다고 했을경우.

a라는 변수값을 사용할대 메모리에 두고 그냥 쓰는 것이 아니라

A가 쓸땐 A의 캐시 메모리에

B가 쓸댄 B의 캐시 메모리에 두고 사용하게 되는데.

A가 A캐시 메모리에 있는 a를 쓰기를 하고 메모리에 덮어쓰지 않을 수 있고

B가 B캐시 메모리에 올려져 있는 a를 사용하게 될경우 동기화 되지 않을 값을 사용할 수 있죠.

그래서 변수에 volatile 라는 키워드를 사용합니다.

이 키워드는 캐시메모리에 있는거 쓰지 말고 항상 메모리에서 엎데이트해서 사용하라 라는 명령어 입니다.
answered (4 point)

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

238 질문
366 answers
375 댓글
467 users