#include <mutex>
int a;
char c;
std::mutex t;
int main()
{
std::lock_guard<std::mutex> zz(t);
a = 2;
c = '1';
return 0;
}
如上面这小段代码,请问c++11中的mutex,是不是只要mutex被锁住了,就是默认对所有的共享数据加上了锁?
巴扎黑2017-04-17 16:30:49
잠금 범위는 잠금 범위에 따라 다릅니다. 따라서 테스트 프로그램에서는 기본 범위가 잠겨 있습니다.
물론 멀티스레딩에서는 사용되지 않기 때문에 샘플 프로그램 자체는 의미가 없습니다. 다중 스레드라고 가정합니다. 이때 다른 스레드는 뮤텍스를 잠그려고 할 때 뮤텍스 잠금이 해제될 때까지 기다려야 합니다. 이는 특정 시간에 하나의 스레드만 변수 a 및 c에 액세스할 수 있음을 의미합니다.
PHPz2017-04-17 16:30:49
잠금 후에는 현재 스레드가 잠금을 해제하지 않는 한 뮤텍스 잠금이 유지됩니다. 현재 스레드는 잠금을 획득하고 다음 실행 줄에 들어갈 때 이미 이 코드 줄을 실행했으므로 뮤텍스 잠금을 해제할 자격이 있습니다. . 잠금을 기다리는 다른 스레드는 운영 체제에 의해 대기 큐에서 깨어날 때까지 잠금이 해제되기 전에 이 코드 줄에서 잠자기 상태가 됩니다.
뮤텍스 잠금은 리소스 액세스를 제어합니다. 임계 영역에 들어가려면 잠금을 획득해야 합니다. 이때 스레드는 리소스를 소비할 수 있는 권한, 즉 공유 데이터를 수정할 수 있는 권한을 갖습니다. 임계 섹션을 종료하려면 잠금을 해제하고 실행을 계속하려면 다른 스레드에 대한 잠금을 해제해야 합니다.
巴扎黑2017-04-17 16:30:49
간단히 말하면 아닙니다. 뮤텍스는 일종의 잠금입니다. 하나의 스레드가 동시에 잠글 수 있도록 보장하지만 전역 변수를 제어하는 방법은 자체 코드로 구현됩니다. 즉, 다른 스레드가 먼저 Mutex를 잠그려고 시도하지 않고 해당 전역 변수를 직접 수정하면 차단되지 않는다는 합의입니다.