Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
1

Guard для мьютекса

14.03.2015, 11:27. Просмотров 623. Ответов 12
Метки нет (Все метки)

Собственно нужно написать гвард для мьютекса. Если я правильно понимаю, в конструкторе нужно принять ссылку на мьютекс и проинициализировать переменную гвард-класса. Тут сразу вопрос, мьютексы копирование не поддерживают , т. е. я не могу переприсвоить один мьютекс другому. Тогда что должен хранить класс? Все-таки мьютекс или какой другой указатель? И еще вопрос - изучал как вообще пользоваться мьютексами - нашел в одном месте Create/ReleseMutex, еще есть std::mutex(lock/unlock). Это что, какие-то разные мьютексы? Тогда каким в каких случаях пользоваться? Ну и в деструкторе по идее надо просто разлочить, ничего удалять не надо?
Заранее благодарю за помощь и ответы
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2015, 11:27
Ответы с готовыми решениями:

Sleep внутри мьютекса
Может ли это как-то вешать программу, если да то почему?

include guard
Объясните пожалуйста попонятнее как использовать include guard. Много всего...

Макрос для include guard
Можно ли каким-либо образом создать шаблон, который вставлялся бы автоматически...

Генерация Steam Guard code для входа в аккаунт
Здравствуйте. Пишу программу, на определенном этапе которой нужно ввести...

Освобождение объекта мьютекса
Подскажите почему не получается освободить объект мьютекса? HANDLE hx;...

12
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
14.03.2015, 12:21 2
Цитата Сообщение от IT_Beginner Посмотреть сообщение
Собственно нужно написать гвард для мьютекса.
Используй готовый: http://en.cppreference.com/w/cpp/thread/lock_guard
Цитата Сообщение от IT_Beginner Посмотреть сообщение
Тогда что должен хранить класс?
Ссылку.
Цитата Сообщение от IT_Beginner Посмотреть сообщение
Create/ReleseMutex, еще есть std::mutex(lock/unlock).
Первое - WinAPI, второе - стандартные классы из C++11.
1
igorrr37
1867 / 1483 / 751
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
14.03.2015, 12:57 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <windows.h>
 
class Mutex
{
public:
    Mutex() : locked(false){}
    bool locked;
};
 
class Guard
{
public:
    Guard(Mutex& rhs) : m(rhs)
    {
        while(m.locked)
        {
            Sleep(100);
        }
        m.locked = true;
    }
    ~Guard()
    {
        m.locked = false;
    }
private:
    Mutex& m;
};
 
Mutex m;
int val;
 
void ExclusivePrint(void* p)
{
    Guard g(m);
    for(int i = 0; i < 5; ++i)
    {
        Sleep(400);
        std::cout << ++val << "  ";
    }
    std::cout << '\n';
}
 
int main ()
{
    int const siz = 3;
    HANDLE arr[siz];
    for(int i = 0; i < siz; ++i)
    {
        arr[i] = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)ExclusivePrint, 0, 0, 0);
    }
    WaitForMultipleObjects(siz, arr, true, INFINITE);
    for(int i = 0; i < siz; ++i)
    {
        CloseHandle(arr[i]);
    }
}
1
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
14.03.2015, 13:13  [ТС] 4
Цитата Сообщение от Tulosba Посмотреть сообщение
Используй готовый: http://en.cppreference.com/w/cpp/thread/lock_guard
так задание свой сделать) я видел lock_guard, думал сделать нечто подобное, пытался разобраться как он устроен. Но до конца не понял что там в конструкторах задается. Ну и появилась мысль что может мне не этот нужен, а тот, что
Цитата Сообщение от Tulosba Посмотреть сообщение
Первое - WinAPI
Для этого и спросил, чем они собственно отличаются

Добавлено через 2 минуты
igorrr37, спасибо, попробую разобраться
0
hoggy
Нарушитель
Эксперт С++
7084 / 3128 / 647
Регистрация: 15.11.2014
Сообщений: 7,194
Завершенные тесты: 1
14.03.2015, 13:18 5
Цитата Сообщение от igorrr37 Посмотреть сообщение
while(m.locked)
* * * * {
* * * * * * Sleep(100);
* * * * }
* * * * m.locked = true;
что это?
пример того, как не нужно делать?
0
DrOffset
8141 / 4722 / 1154
Регистрация: 30.01.2014
Сообщений: 7,692
14.03.2015, 13:19 6
Цитата Сообщение от IT_Beginner Посмотреть сообщение
Для этого и спросил, чем они собственно отличаются
На практике (в win) возможно, что ничем. Т.к. тот, что в С++11 может быть реализован через тот, что в win api. Преимущества стандартных средств в том, что они стандартные и код не надо будет переписывать, чтобы он заработал, например, в Linux или OSX, а другой программист, который будет читать твой код, зная стандартные средства, сразу поймет что в нем происходит (вместо того, чтобы изучать средства синхронизации под N платформ, хотя это тоже полезно).
1
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
14.03.2015, 13:32  [ТС] 7
все-таки нужно под винапишный мьютекс реализовывать гвард. Я так понимаю конструктор должен принимать и хранить хэндл?

Добавлено через 2 минуты
DrOffset, ясно, спасибо, значит как обычно - лучше использовать стандартные инструменты, но при этом понимать как работают WinAPI'шные, для того и упражнение
0
DrOffset
8141 / 4722 / 1154
Регистрация: 30.01.2014
Сообщений: 7,692
14.03.2015, 13:51 8
Цитата Сообщение от IT_Beginner Посмотреть сообщение
Я так понимаю конструктор должен принимать и хранить хэндл?
Да, можно хранить хэндл. Или можно сделать сперва класс Mutex, который будет реализовывать методы lock и unlock, а в Guard передавать уже ссылку на объект класса Mutex и хранить ее. Соответственно в конструкторе выполнять lock, в деструкторе - unlock.
0
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
14.03.2015, 14:19  [ТС] 9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MutexGuard
{
public:
    explicit MutexGuard(HANDLE _h)
    {
        mg = _h;
    }
 
    ~MutexGuard()
    {
        ReleaseMutex(mg);
    }
private:
    HANDLE mg;
};
надо ли в деструкторе еще CloseHandle? Или он сам закроется?
0
DrOffset
8141 / 4722 / 1154
Регистрация: 30.01.2014
Сообщений: 7,692
14.03.2015, 14:25 10
Цитата Сообщение от IT_Beginner Посмотреть сообщение
надо ли в деструкторе еще CloseHandle?
Нет. И причина не в том, что он закроется. Причина в том, что он этим ресурсом не владеет - он им только пользуется. Именно поэтом реализация Mutex как отдельного класса - лучше. Там понятно кто есть кто и за что отвечает, а здесь - нет. Закрывать хэндл мютекса должен класс Mutex, а не Guard.

Добавлено через 3 минуты
Guard должен лочить мютекс в конструкторе и разлочивать в деструкторе - все.
0
castaway
Эксперт С++
4930 / 3037 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
14.03.2015, 14:35 11
Лучший ответ Сообщение было отмечено IT_Beginner как решение

Решение

Простейшая реализация lock_guard на WinAPI.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <iostream>
 
class my_lock_guard {
    HANDLE & m_hMutex;
 
public:
    explicit my_lock_guard( HANDLE & hMutex ) : m_hMutex( hMutex ) {
        WaitForSingleObject( m_hMutex, INFINITE );
    }
 
    ~my_lock_guard() {
        ReleaseMutex( m_hMutex );
    }
};
 
static HANDLE g_hMutex;
 
DWORD WINAPI thread_proc( LPVOID lpParam ) {
    int n = reinterpret_cast<int>( lpParam );
    for ( int i = n; i < n + 5; ++i )
    {
        my_lock_guard lock( g_hMutex );
        std::cout << i << '\n';
        Sleep( 10 );
    }
    return 0;
}
 
int main()
{
    g_hMutex = CreateMutex( NULL, FALSE, NULL );
 
    HANDLE hThreads[2];
    hThreads[0] = CreateThread( NULL, 0, thread_proc, reinterpret_cast<LPVOID>( 1 ), 0, NULL );
    hThreads[1] = CreateThread( NULL, 0, thread_proc, reinterpret_cast<LPVOID>( 100 ), 0, NULL );
    WaitForMultipleObjects( 2, hThreads, TRUE, INFINITE );
 
    CloseHandle( g_hMutex );
}
1
IT_Beginner
4 / 4 / 1
Регистрация: 17.02.2015
Сообщений: 64
14.03.2015, 14:36  [ТС] 12
хм, я так понял только в std'шный мьютекс заложен функционал лок/анлок, с винапишным надо самому реализовывать? какой тогда смысл в таком мьютексе?
0
DrOffset
8141 / 4722 / 1154
Регистрация: 30.01.2014
Сообщений: 7,692
14.03.2015, 14:37 13
Лучший ответ Сообщение было отмечено IT_Beginner как решение

Решение

Цитата Сообщение от IT_Beginner Посмотреть сообщение
хм, я так понял только в std'шный мьютекс заложен функционал лок/анлок, с винапишным надо самому реализовывать? какой тогда смысл в таком мьютексе?
См. ответ castaway.
Я имел в виду нечто подобное:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Mutex
{
public:
    Mutex()
        : mutex_(CreateMutex(0, FALSE, 0))
    { }
 
    ~Mutex()
    {
        CloseHandle(mutex_);
    }
 
    bool isValid() const
    {
        return mutex_ != NULL;
    }
 
    bool lock()
    {
        return WaitForSingleObject(mutex_, INFINITE) != WAIT_FAILED;
    }
 
    bool unlock()
    {
        return ReleaseMutex(mutex_);
    }
 
private:
    Mutex(Mutex const &);
    Mutex & operator=(Mutex const &);
 
    HANDLE mutex_;
};
 
class MutexGuard
{
public:
    explicit MutexGuard(Mutex & mutex)
        : mutex_(mutex)
    {
        mutex_.lock();
    }
    ~MutexGuard()
    {
        mutex_.unlock();
    }
private:
    Mutex & mutex_;
};
1
14.03.2015, 14:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2015, 14:37

Некорректное использование мьютекса
Здравствуйте. Пишу небольшой драйвер-фильтр, одной из задач которого является...

Странное поведение мьютекса
Имеется такой кусок кода Mutex instanse; bool...

Таски и захват мьютекса
Перешел с одного компа на другой - получил проблему. Использую таски. Таски...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru