srand는 각 스레드의 로컬 저장소에 seed 값을 저장하므로 multi thread 환경에서는 각 thread 마다 호출해야 seed가 제대로 설정된다.




출처 : http://blog.naver.com/iihyungii/110033061647
C 런타임 함수들은 Multi Thread 환경에 대비하기 위해 FLS(Fiber Local Storage)를 사용하여 데이터를 관리한다.
FLS란 간단하게 쓰레드 단위로 데이터를 공유한다고 보면 된다.
FLS를  사용하기 위해서는 저장을 하거나 읽어올때 인덱스가 필요한데 dll을 여러개 사용하게 될 경우 여기서 문제가 발생할 수 있다.
dll은 dll별로 별도의 메모리 공간을 가지고 있는데 Mutl Thread 옵션을 사용할 경우 C런타임 함수를 lib로 사용하기 때문에 dll별로 별도의 인덱스를 가지게 되는 것이다.
쓰레드 단위로 데이터를 공유한다고 해도 각각 다른 인덱스를 가지고 접근하기 때문에 결국엔 dll별로 별도의 데이터를 가지게 된다.

 

예를 들어
A와 B라는 프로젝트가 있고 B가 dll프로젝트인 경우 A에서 srand를 하고 B에 있는 함수를 호출하여 B안에서 rand를 호출해도 B에서는 srand가 적용되지 않은 상태로 인식한다.
따라서 dll을 사용할 경우에는 Multi Thread DLL 옵션을 사용해야 문제를 일으키지 않는다.

 
이것과 비슷한 내용은 MSDN에도 나와있다.
If you have more than one DLL or EXE, then you may have more than one CRT, whether or not you are using different versions of Visual C++. For example, statically linking the CRT into multiple DLLs can present the same problem. Developers encountering this problem with static CRTs have been instructed to compile with /MD to use the CRT DLLL.





저작자 표시
신고
by 흥배 2009.09.13 00:12
| 1 |

티스토리 툴바