두 개의 스레드를 사용해야합니다. 하나는 행렬에 대해 다양한 연산을 수행하고, 다른 하나는 행렬 연산 프로세스의 다양한 지점에서 가상 메모리를 모니터합니다. 이 메서드는 전역 상태 변수 'flag'를 사용하는 데 필요합니다.C에서 스레드 동기화
지금까지 나는 다음 (간결함을위한 몇 가지 밖으로 떠나)이 있습니다
int flag = 0;
int allocate_matrices(int dimension)
{
while (flag == 0) {} //busy wait while main prints memory state
int *matrix = (int *) malloc(sizeof(int)*dimension*dimension);
int *matrix2 = (int *) malloc(sizeof(int)*dimension*dimension);
flag = 0;
while (flag == 0) {} //busy wait while main prints memory state
// more similar actions...
}
int memory_stats()
{
while (flag == 0)
{ system("top"); flag = 1; }
}
int main()
{ //threads are created and joined for these two functions }
당신이 기대하는 것처럼, system("top")
전화가 한 번 발생을의 행렬이 할당 한 다음 프로그램은 무한 루프에 빠진다 . 이것은 분명히 memory_stats
함수에 할당 된 스레드가 이미 작업을 완료했기 때문에 플래그가 다시 업데이트되지 않기 때문입니다.
우아한 방법이 있나요? 메모리 통계를 4 번 인쇄해야한다는 것을 알기 때문에, 각자간에 글로벌 플래그에 대해 바쁜 대기 조건으로 memory_stats
함수에서 4 개의 루프를 작성하는 동안 발생할 수 있습니다. 그러나 그것은 내게 어색한 것처럼 보입니다. 어떤 도움이나 조언을 부탁드립니다.
스레드를 사용하지 않습니까? 이 경우에는 아무런 의미가 없기 때문입니다. 또는 뮤텍스 또는 원자 기본 요소를 사용하십시오. –
이 작업에는 Pthreads를 사용해야합니다. https://computing.llnl.gov/tutorials/pthreads/ –
@ VladLazarenko 네 말이 맞아, 이치에 맞지 않아. 나는이 모든 것들이 순차적으로 쉽게 행해질 수 있으며 내가 선택의 여지가 있다면 그렇게 할 수 있음을 깨닫는다.나에게도 일어난 뮤텍스를 사용했다면, 이론은 전혀 다르겠습니까? 즉, 간헐적 인 바쁜 대기로 4 개의 루프를 작성하는 것보다 더 우아한 해결책이 있습니까? – aquemini