필자는 개인적으로 구현 한 데이터 구조를 가지고 있으며 이제는 여러 스레드에서 사용해야합니다.C - 내 데이터 구조 구현을 동기화하는 방법?
typedef struct
{
void** array_of_elements;
size_t size;
} myStruct;
단순 들어, 내 데이터 구조가 이러한 기능을 가지고 가정 해 봅시다 :
// Gets a data element from the structure.
void* get(myStruct *x);
// Prints out all the data elements.
void print(myStruct *x);
// Adds an element into the structure.
void add(myStruct *x, void *to_be_added);
그것은 그들이 모두 접근이기 때문에 다른 스레드가 print
를 호출하는 동안 어떠한 get
를 호출 할 수있는 문제가 아니다. 그러나 및 print
은 현재 작동 중이며 add
은 현재 호출 중입니다. 그 반대의 경우 은 현재 get
및 print
이 진행중인 경우 작동하지 않습니다.
myStruct
변경 다음
typedef struct
{
void** array_of_elements;
size_t size;
// True when a mutator is editing this struct.
bool mutating;
// The number of threads currently accessing this struct.
int accessors;
} myStruct;
이제 내 기능을 다음과 같이 :
void* get(myStruct *x)
{
// Wait for mutating to end.
while (x->mutating);
// Indicate that another accessor is now using this struct.
x->accessors++;
// get algorithm goes here
// Declare we are finished reading.
x->accessors--;
return ...
}
// Same as above...
void print(myStruct *x)
...
void add(myStruct *x)
{
// Wait for any accessors or mutators to finish.
while (x->mutating || x->accessors > 0);
x->mutating = true;
// add algorithm here
x->mutating = false;
}
하지만를, 내가 많은 문제가이 함께 있다고 생각 접근 방법을 찾지 못하면 해결 방법을 찾을 수 없습니다.
- 나의 급우 중 한 명은 나 같은 사용 루프를 사용하여 대단히 느려지라고 말했습니다.
- 큐 감각이 없습니다.
myStruct
이 끝나기를 기다리기 시작하는 첫 번째 방법은 반드시 다음에가는 것이 아닙니다. - 스레드가 다음에가는 대기열 데이터 구조가있는 경우에도 데이터 구조도 동기화되어야합니다 (). 동기화 자체 데이터 동기화를 필요로하는 무한 루프 자체가입니다.
- 나는 그것이 뮤 테이터 스레드가 값의보고에 대해 같은 나노에 두 번째 스레드가
0
및 돌연변이 시작입니다1
-0
에서accessors
카운터 (그들은 독서를 시작하려는 의미), 그것은 가능을 변경하는 것이 가능하다고 생각. 그런 다음 뮤 테이터 스레드와 접근 자 스레드가 동시에 진행됩니다. - 나는이 논리가 그리드 - 락 (서로를 무한히 기다리는 스레드)을 야기 할 수 있다고 확신한다.
- 특정 스레드를 잠자기 상태로 만드는 방법을 알지 못하고 루프가
while
루프에 걸리는 것 외에도이 작업을 위해 필요할 때 바로 깨울 수 있습니다.
읽기/쓰기 잠금을 조사하십시오 ... – Dmitri
@Dmitri 실제 구현이 어떻게 될지 원격으로 읽기/쓰기 잠금을 가지고 있지 않습니까? – Hatefiend
스레드간에 변수를 공유하는 경우 원자 접근이나 뮤텍스와 같은 일종의 동기화 메커니즘을 사용해야합니다. 읽기 - 쓰기 잠금은 다중 스레드가 읽을 수 있지만 쓰기를 위해 독점적 인 액세스가 필요하다는 점을 제외하고는 뮤텍스와 같습니다. posix 쓰레드의 경우,'pthread_rwlock_t'가 있습니다. 윈도우에 "슬림 리더 라이터 잠금"이 있습니다. – Dmitri