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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 4.79
Акелла
Сонный металюга
45 / 45 / 6
Регистрация: 10.05.2009
Сообщений: 295
#1

Синхронизация процессов при помощи мьютексов - C++

13.11.2009, 10:58. Просмотров 3503. Ответов 24

начал разбираться с мбютексами, а точнее как синхронизировать 2 рпоцесса с их помощью.

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
#include <stdlib.h>
#include <semaphore.h>
#include <pthread.h>
#include <string.h>
 
pthread_mutex_t work_mutex;
 
pid_t makeproc(void)
{
    pid_t pid;
 
    if((pid = fork())<0)
    {
       printf("fork faled\n");
       exit(1);
    }
    else return pid;
}
int my_mutex_init(void)
{
    int res;
    res = pthread_mutex_init(&work_mutex, NULL);
    if(res != 0)
    {
        printf("Mutex init falled!\n");
        exit(1);
    }
    else return res;
}
 
int main(void)
{
    pid_t pid;
    int res, iLenStr;
 
    res = my_mutex_init();
 
    pid = makeproc();
 
       switch(pid)
    {
        case 0:
        {
            pthread_mutex_lock(&work_mutex);
 
            printf("this is a child\n");
            sleep(20);
 
            printf("lock child - finish\n");
        
            pthread_mutex_unlock(&work_mutex);
 
 
        }break;
 
        default:
        {
 
            sleep(2);
            pthread_mutex_lock(&work_mutex);
 
            printf("this is a parent\n");
            sleep(10);
 
            printf("lock parent - finish\n");         
 
            pthread_mutex_unlock(&work_mutex);
 
        }break;
    }
 
 
 
}
Добавлено через 1 минуту
по идее, чайлд процес должен залочить мьютекс первым и подождав 20 сек вывести сообщение что он разлочился. потом лочит перент, ждет 10 и выводит что он тоже.

результат - не лочит никто. что я неправильно сделал?
1
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2009, 10:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Синхронизация процессов при помощи мьютексов (C++):

График функции при помощи image - C++ Builder
Подскажите пожалуйста как построить график функции при помощи image? Я не могу понять куда вписывать функцию? дайте пожалуйста код...

Подсветка синтаксиса при помощи TRichEdit - C++ Builder
Нужна подсветка синтаксиса как в нормальных отладчиках. Т.е. пишешь код или вставил ctrl+v - текст сразу отформатировался. Реально ли это...

Выполнение действия при помощи RegisterHotKey - C++ Builder
Привет всем! При использовании горячих клавиш в моей программе, я столкнулся с одной проблемой. Мне нужно, при нажатии определенных...

Управление видимостью компонент при помощи меню - C++ Builder
Не пойму никак, как управлять компонентами меню? Создание и все такое получается, нет проблем. ВОТ менять компоненты с учетом выбранной...

Добавить на форму компоненты при помощи кода - C++ Builder
заинтересовался вопросом - можно ли как-то добавить на форму компоненты при помощи кода? (например, при нажатии на кнопочку на форму...

Записать аудио и сохранить в файл при помощи mciSendString() - C++ Builder
Подскажите пожалуйста как правильно это записывать (хочу сохранить в аудиофайл) void __fastcall TForm1::Image28Click(TObject *Sender) {...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Sergeymd
0 / 0 / 0
Регистрация: 13.09.2009
Сообщений: 45
02.12.2009, 21:22 #16
я имею ввиду что все равно сообщение должно выводиться так:
child: sem locked
parent: sem unlocked

а оно не так выводит

ps:может я чего не понимаю я думал что семафор работает не важно с каким процессом, главное чтобы semop() было задано или не так?
0
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
02.12.2009, 21:29 #17
Цитата Сообщение от Sergeymd Посмотреть сообщение
а оно не так выводит
Ну не знаю, у меня именно так и выводится. Либо у тебя ядро сконфигурировано особо извращенным способом, раз отказывается синхронизировать.
1
Sergeymd
0 / 0 / 0
Регистрация: 13.09.2009
Сообщений: 45
02.12.2009, 21:53 #18
Gravity, то есть у тебя выводит
child: sem locked
parent: sem unlocked

даже если поменять условие на if(pid == 0)?

ps:у меня ubuntu 9.04 стоит
0
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
02.12.2009, 21:54 #19
Sergeymd, ага. И собсно не вижу причин, чтобы смена pid процесса как-то на это влияла (разве что глюки в самой системе).
1
Sergeymd
0 / 0 / 0
Регистрация: 13.09.2009
Сообщений: 45
02.12.2009, 22:27 #20
ну и я так вобще думал) я уже 2-ой день втыкаю

оно выводит то нормально, то не правильно

Добавлено через 28 минут
может быть из-за того что я ubuntu поставил на виртуальную машину?
0
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
02.12.2009, 22:40 #21
Вряд ли конечно, но попробуй загрузиться в LiveCD и там скомпилировать этот пример.
У меня на VBox тоже стоит бубунта 9.10 и в ней все верно запускается.
1
Sergeymd
0 / 0 / 0
Регистрация: 13.09.2009
Сообщений: 45
02.12.2009, 22:59 #22
да но на livecd как скомпилить коде блокса нету, консоль я не помню)

ps: к сати у меня версия 9.04 а тот же самый код у знакомого на версии 8.04 компилируется
думаю сейчас другую убунту поставить
0
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
02.12.2009, 23:01 #23
Цитата Сообщение от Sergeymd Посмотреть сообщение
да но на livecd как скомпилить коде блокса нету, консоль я не помню)
Bash
1
gcc -o proga proga.c
1
Sergeymd
0 / 0 / 0
Регистрация: 13.09.2009
Сообщений: 45
02.12.2009, 23:27 #24
проблема в Сode Blocks в консоле нормально компилит
0
Sergeymd
0 / 0 / 0
Регистрация: 13.09.2009
Сообщений: 45
03.12.2009, 17:08 #25
у меня что то не получается за синхронизировать 4 процесса, тоесть я хочу чтобы выводила 1,2,3,4
оно выводит 3,1,2

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/types.h>
 
#define KEY 1147
#define KEY2 1148
#define KEY3 1149
 
 
int main(void)
{
  pid_t a;
  pid_t b;  
  int semid,semid2,semid3;
  struct sembuf sem_wait[2] = { {0, -1, 0}, {0, 1, 0} };
  struct sembuf sem_wait2[2] = { {0, -1, 0}, {0, 1, 0} };
  struct sembuf sem_wait3[2] = { {0, -1, 0}, {0, 1, 0} };
 
 if( (semid = semget(KEY, 2, 0666 | IPC_CREAT))   < 0)
  {
     perror("semget");
     return -1;
  }
   if( (semid2 = semget(KEY2, 2, 0666 | IPC_CREAT))   < 0)
  {
     perror("semget");
     return -1;
  }
  
  if( (semid3 = semget(KEY3, 2, 0666 | IPC_CREAT))   < 0)
  {
     perror("semget");
     return -1;
  }
 
  if( (a = fork()) && (b = fork())< 0)
  {
    perror("fork");
    return -1;
  }
 
 
//-------------------------------------------
  if(a==0 && b>0)
  { 
    semop(semid2, &sem_wait2[0], 1);
    printf("3\n");    
    semop(semid3, &sem_wait3[1], 1);               
  }
  if(a==0 && b==0)
  {        
    semop(semid3, &sem_wait3[0], 1);
    printf("4\n"); 
   }
  if(a>0 && b==0)
  {        
    semop(semid, &sem_wait[0], 1);
    printf("2\n");
    semop(semid2, &sem_wait2[1], 1);
  }
  if(a> 0 && b> 0)
  {                       
    printf("1\n");
    semop(semid, &sem_wait[1], 1);
  }
 
return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2009, 17:08
Привет! Вот еще темы с ответами:

Как заменить некоторый текст написанный в word при помощи C++Builder - C++ Builder
Народ подскажите кто знает, имеется шаблон в word документе (fam 1,fam2 и т.д) вообщем нужно что бы эти фразы заменялись на записи...

Как развернуть форму свёрнутую в трей при помощи клавишь на клавиатуре? - C++ Builder
Здравствуйте! Помогите разобраться с таким вот вопросом.... Как развернуть форму свёрнутую в трей при помощи комбинации клавишь...

Как полученый при помощи OpenDialog адрес файла, присвоеный переменной F, использовать для запуска - C++ Builder
как полученый при помощи OpenDialog адрес файла, присвоеный переменной F, можно использовать для запуска этого файла в строке

Можно ли в билдере при помощи MS Access создать функцию "Регистрация" в программе - C++ Builder
Можно ли в билдере при помощи MS Access создать функцию &quot;Регистрация и Вход&quot; в программе? И как это можно сделать? Кто сможет...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.12.2009, 17:08
Ответ Создать тему
Опции темы

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