2012-08-17 2 views
5

C에서 공유 라이브러리를 쓰고 있습니다. C 함수는 스레드로부터 안전하지 않습니다. 모든 방법은 lib_handle 객체에 대한 포인터를 취C 라이브러리 스레드를 안전하게 만들기

struct lib_handle { 
.... 
}; 

int lib_init(lib_handle **handle); 
int lib_process(lib_handle *handle); 
.... 
.... 

처럼

내 라이브러리 루틴 보인다. 모든 상태는이 구조 안에 저장됩니다. 전역 변수는 사용되지 않습니다.

각 스레드가 자신의 lib_handle 인스턴스를 생성하면 여러 스레드가 라이브러리 함수를 사용할 수 있다고 가정합니다. 각 스레드는 자체 핸들을 가지고 있으므로 everythibg가 작동해야합니다.

아직이 가정을 확인하지 않았습니다. 당신이이 디자인에 대해 어떻게 생각하는지 궁금합니다. 그리고 각 스레드가 자신의 핸들을 가지고 있기 때문에 라이브러리를 쓰레드 안전하다고 말할 수 있습니까?

도움이 될 것입니다.

+0

이 라이브러리는 SQLite 이외의 라이브러리를 사용하지 않습니다. SQLite 자체는 스레드로부터 안전합니다. –

+0

안녕하세요, +1, 드디어 합리적인 질문입니다. –

답변

3

이렇게하면 라이브러리 스레드의 데이터/상태가 안전 해집니다.

하지만 라이브러리가 다른 라이브러리의 threadsafe 기능을 사용하는지 확인해야합니다 (예 : strtok 대신 strtok_r을 사용하십시오.

+0

예. 당신이 올바른지. 다른 함수 표준 라이브러리 함수는 어떻습니까? –

+0

@Appu 대부분의 표준 함수는 달리 명시하지 않는 한 스레드로부터 안전합니다. 가장 좋은 방법은 함수의 맨 페이지를 보는 것입니다. – Rohan

1

스레드는 공유 메모리 공간에서 작동합니다. 불안전 한 객체는 여러 스레드가 동시에 액세스 할 수있는 객체입니다. 따라서 각 스레드에 대해 단일 lib_handle 객체가 있으면 문제가 없습니다.

0

각 스레드에 전용 lib_handle 개체가있는 경우 라이브러리가 완전히 스레드 안전해야합니다. 여러 스레드가 lib_handle 객체를 공유하게하면 라이브러리를 사용하는 사람은 라이브러리를 올바르게 사용하면 스레드 안전 프로그램을 만들 수 있습니다 (예 : 라이브러리가 본질적으로 전역 변수를 사용하는 경우 스레드 안전하지 않음).

이 작업 모드 (공유 lib_handle)가 흥미로운 경우 lib_handle의 상태를 읽는 기능과 lib_handle의 상태를 조작하는 기능을 명확하게 구분해야합니다. 전자는 읽기 잠금이 필요하고 후자는 쓰기 잠금이 필요합니다 (호출 범위가이를 처리해야합니다).

당신이 묘사하는 패턴을 꽤 많이 사용했기 때문에 가치가 있습니다.

관련 문제