2011-01-25 8 views
0

C에서 고성능 동기화 생성기를 작성하려고합니다. 이벤트를 피드로 보내고 스레드가 중복을받지 않도록 여러 스레드에서 비동기 적으로 폴링/읽기를 수행 할 수 있기를 원합니다.C의 스레드 안전성?

동기화가 일반적으로 수행되는 방법에 대해 많이 알지 못합니다. 누군가 내가 사용할 수있는 하나 이상의 기술에 대한 높은 수준의 설명을 줄 수 있습니까?

감사합니다!

답변

1

스레드 안전의 기본 개념은 Mutex입니다 (다른 종류의 잠금이 있지만). 여러 개의 액세스 및 경쟁 조건으로부터 메모리를 보호하는 데 사용됩니다.

좋은 사용 예는 Linked List을 사용할 때입니다. 두 개의 다른 스레드가 동시에 수정하도록 허용 할 수 없습니다. 귀하의 예에서, 당신은 아마도 연결 목록을 사용하여 대기열을 만들 수 있으며, 각 쓰레드는 그것으로부터 어떤 데이터를 소비합니다.

분명히 다른 동기화 메커니즘이 있지만이 기능은 (지금까지는) 가장 중요합니다.

자세한 구현 정보는 this 페이지 (하단의 참조 페이지)를 참조하십시오.

+0

고마워요! 이것이 내가 잊어 버린 개념이라고 생각합니다. 클라이언트가 별도의 스레드에있을 때와 마찬가지로 클라이언트가 다른 시스템에있는 곳에서 작업하기를 원하기 때문에 스레드 기반의 동기화가 제대로 작동하는지 100 % 확신 할 수는 없습니다. –

+0

어쩌면 당신은 당신이하려고하는 것과 당신이 그것을 어떻게 할 것인지 더 잘 이해할 수 있어야합니다. 동일한 머신에 많은 클라이언트가 있다고하더라도 다른 스레드 또는 다른 프로세스를 실행해야합니까? 그렇게 명확하지 않습니다. –

+0

저는 응용 프로그램을 배치하는 방법을 정확히 이해하고 있습니다. 감사 :) –

2

thread implementation이 필요합니다. C에는 다중 처리 개념에 대한 기본 제공 지원이 없습니다. 스레드는 종종 라이브러리로 구현됩니다. 이러한 라이브러리는 일반적으로 여러 스레드의 실행, 데이터 보호 방법 등을 동기화하는 방법을 제공합니다.

+0

구현 독립적 인 방식으로 동기화하는 것이 불가능합니까? 나머지 아키텍쳐에 대해서는 잘 모르기 때문에 물어 봅니다. 네트워크를 통해 이벤트가 전달되는 시스템 모드가있을 수 있습니다. 따라서 동기화는 내부의 스레드가 아닌 머신간에 동기화가 이루어질 수 있습니다. 단일 부모 프로세스. 이것이 중요한 차이를 낳습니까? –

+0

두 개의 별도 기계는 메모리를 공유하지 않으므로 여기서 확인해야합니다. –

+0

그 말이 맞는 것 같아요. 이 경우의 동기화는 TCP 스택 또는 소켓 처리 코드에 있습니다. –

0

스레드간에 공유 변수가있는 경우 스레드 안전이 문제가됩니다. 공유 변수가 없다면 문제가되지 않습니다. 모든 이벤트는 읽기 전용이며 청취자에게 무작위로 분리 될 수 있습니다.

0

스레드 안전성은 멀티 스레드 구현이 제공하는 모든 동기화 프리미티브를 사용하여 이루어집니다.

시작점은 연결된 이벤트 목록, 보호하는 잠금 및 모든 스레드가 잠금을 취하고 포인터를 첫 번째 이벤트로 조정하여 하나의 이벤트를 소비 한 다음 잠금을 해제합니다. 이벤트를 추가하면 전체 목록도 잠 깁니다. 목록이 비어 있으면 작업자가 종료됩니다.

는 거기에서 다양한 최적화가 가능합니다 :

  • 그래서 목록에 이벤트를 추가, 마지막 이벤트 포인터를 캐싱 저렴된다.
  • 목록이 비어있는 동안 작업자 스레드가 잠자기 상태가 될 수 있도록 알림 메커니즘을 추가합니다. 일반적으로 이것은 조건 변수이라는 이름으로 이루어집니다.
  • 여러 목록을 사용하므로 첫 번째 목록이 잠겨 있으면 작업자는 현재 목록을 잠근 스레드를 기다리지 않고도 다른 목록에서 이벤트를 검색 할 수 있습니다.
관련 문제