Форум программистов, компьютерный форум CyberForum.ru

Объекты синхронизации. мьютексы, семафоры - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 26, средняя оценка - 4.92
accidentt
0 / 0 / 0
Регистрация: 17.02.2012
Сообщений: 3
14.03.2012, 14:18     Объекты синхронизации. мьютексы, семафоры #1
помогите пожалуйста. . Реализовать на семафоре мьютекс. Количественные характеристики мьютекса должны быть аналогичны соответствующему объекту ядра типа мьютекс. С++
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2012, 14:18     Объекты синхронизации. мьютексы, семафоры
Посмотрите здесь:

C++ Семафоры(7 потоков)
C++ Мьютексы
C++ Мьютексы, семафоры
Семафоры C++
C++ что такое семафоры?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aw_rabbit
 Аватар для aw_rabbit
146 / 103 / 6
Регистрация: 08.02.2012
Сообщений: 202
14.03.2012, 16:22     Объекты синхронизации. мьютексы, семафоры #2
реализовать что?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.03.2012, 17:28     Объекты синхронизации. мьютексы, семафоры #3
Цитата Сообщение от aw_rabbit Посмотреть сообщение
реализовать что?
Mutex
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
14.03.2012, 18:28     Объекты синхронизации. мьютексы, семафоры #4
А в чём проблема? Семафор, считающий до одного будет тем, чем нужно, только вызовы обернуть в однострочные функции и надо.
aw_rabbit
 Аватар для aw_rabbit
146 / 103 / 6
Регистрация: 08.02.2012
Сообщений: 202
14.03.2012, 23:21     Объекты синхронизации. мьютексы, семафоры #5
Странная задача, обычно наоборот.

Цитата Сообщение от NoMasters Посмотреть сообщение
А в чём проблема? Семафор, считающий до одного будет тем, чем нужно, только вызовы обернуть в однострочные функции и надо.
Там один нюанс - разблокировать мьютекс может только тот поток который его заблокировал, а увеличить значение семафора может любой. Т.е. нужно управлять доступом потоков к семафору, но как-то это криво будет.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
15.03.2012, 00:07     Объекты синхронизации. мьютексы, семафоры #6
Ну прикрутить один дополнительный флаг, дающий понять наш ли мьютекс и всё.
accidentt
0 / 0 / 0
Регистрация: 17.02.2012
Сообщений: 3
19.03.2012, 18:57  [ТС]     Объекты синхронизации. мьютексы, семафоры #7
видение полной картины реализации так и не получается..
aw_rabbit
 Аватар для aw_rabbit
146 / 103 / 6
Регистрация: 08.02.2012
Сообщений: 202
20.03.2012, 00:35     Объекты синхронизации. мьютексы, семафоры #8
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
#ifndef MUTEX_H
#define MUTEX_H
#include <semaphore.h>
#include <pthread.h>
 
enum mutex_lock_err {Ok, INVAL, DEADLK, PERM, BUSY};
 
class Mutex
{
public:
    Mutex();
    ~Mutex();
    mutex_lock_err lock();
    mutex_lock_err unlock();
    mutex_lock_err trylock();
    bool is_init();
 
 
private:
    sem_t my_sem;
    int sem_val;
    bool isOk;
    pthread_t ntid;
};
 
#endif // MUTEX_H
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "mutex.h"
 
Mutex::Mutex()
{
    int err;
    err=sem_init(&my_sem, 0, 1);
        if(err==-1)
            isOk=false;
        else
            isOk=true;
}
 
Mutex::~Mutex()
{
    sem_destroy(&my_sem);
}
 
mutex_lock_err Mutex::lock()
{
    if(!isOk)
        return INVAL;
    int err = sem_getvalue(&my_sem, &sem_val);
    if(err==0 && sem_val>0)
    {
        ntid=pthread_self();
        sem_wait(&my_sem);
        return Ok;
    }
    if(err=0 && sem_val<=0)
    {
        if(ntid==pthread_self())
        {
            //has already locked
            return DEADLK;
        }
        else
        {
            // wait when it will free
            sem_wait(&my_sem);
            ntid=pthread_self();
            return Ok;
        }
    }
}
 
mutex_lock_err Mutex::unlock()
{
    if(!isOk)
        return INVAL;
    if(ntid==pthread_self())
    {
        sem_post(&my_sem);
        return Ok;
    }
    else
        // it is not your mutex
        return PERM;
 
 
}
 
mutex_lock_err Mutex::trylock()
{
    if(!isOk)
        return INVAL;
    int err = sem_getvalue(&my_sem, &sem_val);
    if(err==0 && sem_val>0)
    {
        ntid=pthread_self();
        sem_wait(&my_sem);
        return Ok;
    }
    if(err=0 && sem_val<=0)
    {
        return BUSY;
    }
}
 
bool Mutex::is_init()
{
    return isOk;
}
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
#include <stdio.h>
#include "mutex.h"
#include <pthread.h>
 
using namespace std;
 
Mutex my_mutex;
int count =10;
void * print_string(void * arg);
 
int main()
{
    printf("Hello World! I am here. \n" );
 
    if(!my_mutex.is_init())
        return -1;
 
    pthread_t ntid1, ntid2;
    int err;
    err=pthread_create(&ntid1, NULL, print_string, NULL);
    if(err!=0)
        printf("can't create tread \n");
 
    err=pthread_create(&ntid2, NULL, print_string, NULL);
    if(err!=0)
        printf("can't create tread \n");
 
    while(count>0)
    {
        my_mutex.lock();
        printf("main thread \n");
        count--;
        my_mutex.unlock();
    }
 
 
    return 0;
}
 
 
void * print_string(void * arg)
{
    pthread_t tid=pthread_self();
    while(count>0)
    {
        my_mutex.lock();
        printf("tread %u \n", (unsigned int) tid);
        count--;
        my_mutex.unlock();
 
    }
 
    pthread_exit(NULL);
 
    return NULL;
}
Добавлено через 9 минут
там с ntid глюк может быть, завтра может быть исправлю
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2012, 21:05     Объекты синхронизации. мьютексы, семафоры
Еще ссылки по теме:

C++ В окне перемещаются объекты, отталкиваясь от стенок окна. Каждый объект имеет свой поток, перемещающий его. Встретившись, объекты начинают двигаться
Функция создает объекты и указателями на них заполняет массив. При выходе из функции вызываются деструкторы объектов. Как сохранить объекты? C++
Понятие синхронизации потоков и процессов. Семафоры и мьютексы C++

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

Или воспользуйтесь поиском по форуму:
accidentt
0 / 0 / 0
Регистрация: 17.02.2012
Сообщений: 3
01.04.2012, 21:05  [ТС]     Объекты синхронизации. мьютексы, семафоры #9
Ребят, спасибо всем. Но тут, к сожалению, выяснилось, что нужно использовать функции WinAPI...))) в любом случае, спасибо за помощь всем)
Yandex
Объявления
01.04.2012, 21:05     Объекты синхронизации. мьютексы, семафоры
Ответ Создать тему
Опции темы

Текущее время: 16:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru