(익명 뮤텍스 예제)에 따라 boost::interprocess::shared_memory_object
을 사용하여 Linux에서 IPC를하고 있습니다.boost :: interprocess :: scoped_lock을 사용하는 동안 절전 모드를 해제하면 절대로 해제되지 않습니다.
서버 프로세스는 shared_memory_object
를 작성하고 interprocess_mutex
을 scoped_lock
에 랩핑하여 보유하고 있습니다. 그리고 다른 하나가 쓴 것을 인쇄하는 클라이언트 프로세스 -이 경우 int
입니다.
문제가 생겼다. 서버가 뮤텍스를 유지하면서 잠자면 클라이언트 프로세스는 결코 그것을 획득 할 수없고 영원히 기다린다.
버기 서버 루프 :
using namespace boost::interprocess;
int n = 0;
while (1) {
std::cerr << "acquiring mutex... ";
{
// "data" is a struct on the shared mem. and contains a mutex and an int
scoped_lock<interprocess_mutex> lock(data->mutex);
data->a = n++;
std::cerr << n << std::endl;
sleep(1);
} // if this bracket is placed before "sleep", everything works
}
서버 출력 :
acquiring mutex... 1
acquiring mutex... 2
acquiring mutex... 3
acquiring mutex... 4
클라이언트 루프 :
while(1) {
std::cerr << "acquiring mutex... ";
{
scoped_lock<interprocess_mutex> lock(data->mutex);
std::cerr << data->a << std::endl;
}
sleep(1);
}
클라이언트 출력 (영원히 대기) :
acquiring mutex...
문제는 sleep
호출 전에 괄호를 줄에 놓으면 모든 것이 작동한다는 것입니다. 왜? 잠긴 뮤텍스로 잠자는 것은 뮤텍스가 영원히 잠길 것이라고 생각하지 않았습니다.
내가 가진 유일한 이론은 커널이 서버 프로세스를 깨우면 범위가 끝나고 뮤텍스가 해제되지만 대기 프로세스에는 실행할 기회가 주어지지 않는다는 것입니다. 그런 다음 서버가 잠금 장치를 다시 얻습니다.하지만 이는별로 의미가없는 것처럼 보입니다.
고마워!
부스트는 스레드를 포기하는 자체 호출을 가지고 있습니다 (리눅스의 schedu_yield처럼) : boost :: this_thread :: yield() – teeks99
고마워요. 'sleep (0)'이 효과가있어 이론을 확인합니다. 뮤텍스를 공개하는 행위가 최소한 시스템 호출과 그에 따른 일정 조정을 초래할 것이라는 인상하에 있었지만 잘못되었습니다. –