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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Здравствуйте! Создал класс std::string. Не создается объкт типа string... Подскажите в чем причина? http://www.cyberforum.ru/cpp-beginners/thread518602.html
#include <stdlib.h> #include <iostream> #include <string.h> //using namespace std; class string { private: int _size;
C++ Сумма ряда Скажите правильно ли я составил программу? Ввести с клавиатуры х и точность вычисления Eps. Вычислить с заданной точностью сумму S=pow(-1.0 , (k+1)) * (pow(x,k) / (k+3)!); #include "stdafx.h" #include <iostream> #include <clocale> #include <math.h> using namespace std; http://www.cyberforum.ru/cpp-beginners/thread518586.html
_beginthread - Race Condition в отсутствии оного C++
Неправильно обозвал тему :) Правильно - WaitForMultipleObject говорит что все потоки завершены, хотя есть ещё работающие. void thread(void * param) { task_st * task = (task_st*) param; lexical_st * lx = &(task->lx); syntax_st * sx = &(task->sx); fseek(lx->stream, lx->start_pos,SEEK_SET); lex_cut(lx);
C++ Семантика массивов char.
Добрый день. Мы все знаем, что в C и С++ создав два массива подрят.. запросив элемент привышающий размерность первого мы зайдем во второй. Так вот столкнулся со след проблемой в массивах типа char. Написав следующее : char a; a='2'; a='4'; cout<<a; // я получил 24 , что и мною ожидалось. Написав следующее : char a; int b=(int)'0'; a='2';
C++ UserFunction (Пользовательские функции) http://www.cyberforum.ru/cpp-beginners/thread518517.html
Дана матрица arrIn размера M на N, состоящая из целых чисел (int). M, N >= 8. Построить для нее матрицу arrOut такого же размера, элементы которой – числа с плавающей точкой (float) и равны Далее смотреть в документе
C++ Сбор информации об оборудовании до загрузки ОС Добрый день, форумчане. (в заголовке ошибся, речь идет о детекторе-антивирусе) В институте поставили такую вот оригинальную задачку: создать утилиту, которая размещается на флеш-накопителе и при первом запуске машины, после загрузки биоса и до загрузки ОС, собирает информацию о жестком диске (дисках) путем вычисления хэш-образов выбранных групп файлов, сохранения инфы загрузочных секторов,... подробнее

Показать сообщение отдельно
aw_rabbit
 Аватар для aw_rabbit
146 / 103 / 6
Регистрация: 08.02.2012
Сообщений: 202
20.03.2012, 00:35     Объекты синхронизации. мьютексы, семафоры
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 глюк может быть, завтра может быть исправлю
 
Текущее время: 01:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru