Как возможно, что я блокирую мьютекс несколько раз, если мьютекс можно заблокировать только один раз?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как возможно, что я блокирую мьютекс несколько раз, если мьютекс можно заблокировать только один раз?

Сообщение Anonymous »

Я пытаюсь понять семафор и мьютекс 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»