Я пытаюсь понять семафор и мьютекс C++ и обнаружил, что блокирую один мьютекс несколько раз, или, по крайней мере, мои сообщения отладки показывают, что это так.
Хотя у нас есть только 1 мьютекс в семафоре, я получаю его для более чем 1 потока.
Я понимаю, что семафор должен разрешать доступ нескольким потокам (ограничено счетчиком), но внутренне семафор состоит из мьютекса, который может иметь значение 0 или 1, принято или не принято.
По моему мнению, невозможно, чтобы два потока заблокировали мьютекс 1 один за другим, но я вижу это в файле журнала
/**
* Connecting cell phones to a charger
*/
#include
#include
#include
#include
#include
#include
unsigned int data_race = 0;
class Semaphore {
public:
Semaphore(unsigned long init_count) {
count_ = init_count;
}
void acquire(int id) { // decrement the internal counter
printf("%d wants to aquire.\n", id);
std::unique_lock lck(m_);
printf("%d aquired mutex in aquire\n", id);
while (!count_) {
printf("%d is waiting for lock\n", id);
cv_.wait(lck);
}
printf("%d is about to decrease count\n", id);
count_--;
}
void release(int id) { // increment the internal counter
printf("%d is about to relase \n", id);
std::unique_lock lck(m_);
printf("%d acuired mutex in release\n", id);
count_++;
lck.unlock();
cv_.notify_one();
}
private:
std::mutex m_;
std::condition_variable cv_;
unsigned long count_;
};
Semaphore charger(2);
void cell_phone(int id) {
charger.acquire(id);
printf("Phone %d is charging...\n", id);
srand(id); // charge for "random" amount between 1-3 seconds
std::this_thread::sleep_for(std::chrono::milliseconds(rand() % 2000 + 1000));
printf("Phone %d is DONE charging!\n", id);
charger.release(id);
}
int main() {
std::thread phones[6];
for (int i=0; i
PS C:\HHardDrive\embedded C\output> & .\'Semaphore_CriticalSection2.exe'
0 wants to aquire.
0 aquired mutex in aquire //->Mutex locked first time
0 is about to decrease count
Phone 0 is charging...
4 wants to aquire.
4 aquired mutex in aquire //->Mutex locked second time
4 is about to decrease count
Phone 4 is charging...
3 wants to aquire.
3 aquired mutex in aquire
3 is waiting for lock
2 wants to aquire.
2 aquired mutex in aquire
2 is waiting for lock
5 wants to aquire.
5 aquired mutex in aquire
1 wants to aquire.
5 is waiting for lock
1 aquired mutex in aquire
1 is waiting for lock
Phone 0 is DONE charging!
0 is about to relase
0 acuired mutex in release
Phone 4 is DONE charging!
3 is about to decrease count
4 is about to relase
4 acuired mutex in release
Phone 3 is charging...
2 is about to decrease count
Phone 2 is charging...
Phone 2 is DONE charging!
2 is about to relase
Phone 3 is DONE charging!
2 acuired mutex in release
3 is about to relase
5 is about to decrease count
Phone 5 is charging...
3 acuired mutex in release
1 is about to decrease count
Phone 1 is charging...
Phone 1 is DONE charging!
Phone 5 is DONE charging!
1 is about to relase
5 is about to relase
1 acuired mutex in release
5 acuired mutex in release
Подробнее здесь: https://stackoverflow.com/questions/791 ... hall-be-po
Как возможно, что я блокирую мьютекс несколько раз, если мьютекс можно заблокировать только один раз? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение