2017-04-25 14 views
0

N 프로세스가 계속 될 때까지 대기하는 수집 기능을 구현하려고합니다.System V 세마포를 사용하여 gather/barrier 기능 만들기

struct sembuf operations[2]; 

operaciones[0].sem_num = 0; 
operaciones[0].sem_op = -1; // wait() or p() 

operaciones[1].sem_num = 0; 
operaciones[1].sem_op = 0; // wait until it becomes 0 

semop (this->id,operations,2); 

초기 세마포어의 값은 문제가 모든 프로세스는의 semop 함수를 실행 한 경우에도 정지이다 N.

이다. 나는 그것이 조작이 원자 적으로 수행된다는 사실과 관련이 있다고 생각한다 (그러나 나는 그것이 무엇을 의미하는지 정확히 모른다). 하지만 왜 작동하지 않는지 나는 이해하지 못한다.

코드가 세마포어에서 1을 뺀 다음 프로세스가 마지막이 아니거나 다른 방식으로 작동해야하는 경우 프로세스를 차단합니까?

+0

코드는 세마포어 0이 감소 할 때까지 프로세스를 차단하고, 감소 할 때까지 동시에 세마포어 1은 0이됩니다. 단일 또는 전체 또는 일부 트랜잭션입니다. – PSkocik

답변

0

코드가 전체 기능 및 알고리즘없이 수행하는 것을보기가 어렵습니다. 그 외모에 따르면, 하나의 원자 동작에서 2 액션을 적용합니다 : 세마포어에서 1을 뺀 다음 0을 기다리십시오. 모든 프로세스가 멈 추면 몇 가지 문제가 발생할 수 있습니다. 세마포어는 모든 프로세스간에 공유되지 않으며, 세마포어를 시작할 때 프로세스 수가 잘못되거나 한 프로세스가 장벽을 벗어나면 나중에 세마포가 증가하여 장벽으로 돌아갑니다. 모든 프로세스가 실제로 장벽에 있음을 알기 위해 디버깅을 제안합니다. 세마포어에서 작업을 수행 할 때마다 인쇄하는 것이 좋습니다 (동일한 콘솔에서 수행하는 것이 바람직 함).

원자 활동이란 무엇입니까? 실행되는 동안 인터럽트되지 않도록 보장 된 단일 또는 일련의 조작입니다. 즉, 다른 프로세스/스레드가 작업을 방해하지 않습니다.