2012-04-04 3 views
0

스레드가없는 비 안전한 스레드 라이브러리 사용. 서버에 연결하는 라이브러리가 있다고 가정 해보십시오. 그리고 그것은 비 스레드 안전합니다. 2 개의 스레드에서 라이브러리를 시작할 수 있습니까?비 스레드 안전 라이브러리 및 스레드

예 :

thread_1(){ 
telnet_lib_t *connection1; 

while(1){ 
do_somestuff 
} 

free_telnet(connection1); 
} 

thread_2(){ 
telnet_lib_t *connection2; 

while(1){ 
    do_somestuff; 
} 

free_telnet(connection2); 
} 

겠습니까이 작품? 이제는 라이브러리의 독립적 인 인스턴스가 두 개 있습니다. 그래서 그들은 서로 간섭하지 않을거야, 그렇지?

+0

두 개의 스레드로 실행할 수 있지만 컴퓨터에 라이브러리 복사본이 하나만있을 수 있습니다. 두 스레드 중 하나의 호출이 문제를 일으킬 수 있음을 의미합니다. –

답변

1

아니요,이 작업을 수행 할 수 없습니다. 라이브러리에 전역 상태가없고 함수가 내부적으로 스레드 안전하지 않은 경우 전체 라이브러리를 뮤텍스로 보호하고 한 번에 하나의 스레드 만 액세스 할 수 있도록 허용하면 문제를 해결할 수 있습니다 (하지만이 방법은 금지적 일 수 있습니다. 특히 라이브러리가 느린 작업이나 차단하는 작업을 수행하는 경우). 그러나 라이브러리가 근본적으로 단일 전역 상태를 사용하고 상태를 저장/복원/스왑 할 수있는 방법이 없다면 다중 스레드에서이를 사용할 수있는 방법이 없습니다 (또는 스레드가 아닌 프로그램에서 여러 컨텍스트를 번갈아 사용할 수도 있습니다). 이러한 라이브러리는 일반적으로 휴지통으로 간주되므로 교체해야합니다.

0

왜 스레드 세이프가 아닌지에 따라 다릅니다.

예를 들어 라이브러리에서 정적 변수를 사용하는 경우 두 스레드간에 여전히 공유됩니다.

일반적으로 이것은 좋지 않은 아이디어입니다. 스레드가 안전하지 않은 것이 있으면 스레드에서 사용하지 말고 하위 프로세스를 포크 한 다음 스레드보다 무거 우며 안전하게 사용할 수 있습니다.

0

스레드 안전하지 않은 라이브러리에 대한 자세한 내용을 알지 못하는 한 사용자가 제안한대로 사용하는 것이 안전하다고 말할 수는 없습니다.

라이브러리에 전역 공유 리소스 (예 : 전역 변수)가있는 경우 두 스레드는 라이브러리 작성자가 의도하지 않은 방식으로 전역 변수를 덮어 쓰면서 서로 밟을 수 있습니다.

문제는, 테스트의 금액은 이 충돌을 일으키지 않을 것이라는 것을 확실히 증명할 수 있습니다.

라이브러리를 병렬로 사용해야하는 경우 내가 생각할 수있는 유일한 안전한 방법은 프로세스 격리를 사용하는 것입니다. 라이브러리의 인스턴스를 각각로드하는 여러 하위 프로세스를 만듭니다.

0

telnet_lib_t 및 해당 메소드가 전역 상태에서 작동하지 않는 경우 (즉, 전역 변수에 의존하지 않는 경우)에만 가능합니다. 라이브러리 상태가 자체 내에 포함되어 있다는 것을 알고 있다면을 확실히 사용하십시오. 그렇지 않으면 사용하지 마십시오. 테스트 중에 문제가 발생하지 않는다고해도 어딘가에 문제가 있다는 것을 의미하지는 않습니다.