Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/22: Рейтинг темы: голосов - 22, средняя оценка - 4.59
0 / 0 / 1
Регистрация: 02.12.2009
Сообщений: 21

Синхронизация потоков без использования mutex

07.01.2011, 21:46. Показов 4401. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Была написана прога (в целях лабораторной работы) синхронизации потоков,на защиту дали переделать не используя mutex,используя симафоры posix,заменить короче...Впринципе я даже не соображаю как это сделать,прошу помочь разобраться.
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
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
void* write_thread (void*);
void* read_thread (void*);
int bufer[10], w=0, r=0, a=0, x, thread_done=0;
pthread_mutex_t my_sync; // Инициализируем мьютекс
pthread_cond_t rx; // Инициализируем условную переменную
int main ()
{
    pthread_t tid1, tid2; // Инициализация потоков
    pthread_mutex_init (&my_sync, NULL); // Инициализация мьютекса
    pthread_cond_init (&rx, NULL); // Инициализация условной переменной
    pthread_create (&tid1, NULL, write_thread, (void *) NULL); // Создаем поток записи
    pthread_create (&tid2, NULL, read_thread, (void *) NULL); // Создаем поток чтения
    pthread_join (tid1, NULL); // Ждем завершения потоков
    pthread_join (tid2, NULL);
}
void* write_thread (void* dummy) // Функция записи
{
    for (;;) // Бесконечный цикл
    {
        pthread_mutex_lock(&my_sync); // Захватываем мьютекс
        if (thread_done==10) pthread_cond_wait(&rx, &my_sync); // Если пытаемся писать в полный буфер - блокируем поток записи и переходим в поток чтения
        if (a>9) {a=0;} // Если символ больше 10 - обнуляем
        bufer[w]=a; // Записываем в буфер символ
        a++; // Увеличиваем символ на единицу
        thread_done++; // Инкрементируем флаг заполнения буфера
        printf ("\nЗаписан символ buffer[%d]=%d\n", w, bufer[w]); // Выводим записанный символ
        w++; // Инкрементируем индекс массива-буфера
        if (w==10) {w=0;} // Если индекс буфера равен 10 - обнуляем
        pthread_cond_signal (&rx); // "Будим" поток чтения
        pthread_mutex_unlock (&my_sync); // Освобождаем мьютекс
        x=rand()%2500000+500000; // Случайное число секунд от 0,5 до 2
        usleep(x); // Пауза
    }
        return;
}
void* read_thread (void* dummy) // Функция чтения
{
    for (;;)
    {
        pthread_mutex_lock(&my_sync);
        if (thread_done==0) pthread_cond_wait(&rx, &my_sync); // Если пытаемся читать из пустого буфера - блокируем поток чтения и переходим в поток записи
        thread_done--; // Декрементируем флаг заполнения буфера
        printf ("\n  Считан символ buffer[%d]=%d\n", r, bufer[r]); // Выводим считанный символ
        r++;
        if (r==10) {r=0;}
        pthread_cond_signal (&rx); // "Будим" поток записи
        pthread_mutex_unlock (&my_sync);
        x=rand()%2500000+500000;
        usleep(x);
    }
        return;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.01.2011, 21:46
Ответы с готовыми решениями:

Mutex. Синхронизация потоков. Pthread_cond_wait
Здравствуйте! Столкнулась с проблемой в написании лабораторной работы. Задание звучит так: Напишите функцию, удовлетворяющую следующим...

Вывод номеров потоков без использования циклов
Нужно,применяя openMP и mutex-ы вывести на экран номера потоков,не используя циклы. Например у нас 5 потоков есть,вывод : 4,3,2,1,0 С...

Mutex и синхронизация потоков
Задача, как сказал руководитель, на три строчки, но не имею ни малейшего понятия как ее решать. Есть три потока. При помощи одного...

2
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
07.01.2011, 22:55
т.к. у Вас нет конкретного вопроса, рекомендую обратиться к man`у.
man sem_init
man sem_wait
и по референсам.

в man`е приведен такой код:
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 <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#include <time.h>
#include <assert.h>
#include <errno.h>
#include <signal.h>
 
sem_t sem;
 
#define handle_error(msg) \
   do { perror(msg); exit(EXIT_FAILURE); } while (0)
 
static void
handler(int sig)
{
   write(STDOUT_FILENO, "sem_post() from handler\n", 24);
   if (sem_post(&sem) == -1) {
      write(STDERR_FILENO, "sem_post() failed\n", 18);
      _exit(EXIT_FAILURE);
   }
}
 
int
main(int argc, char *argv[])
{
   struct sigaction sa;
   struct timespec ts;
   int s;
 
   if (argc != 3) {
      fprintf(stderr, "Usage: %s <alarm-secs> <wait-secs>\n",
               argv[0]);
      exit(EXIT_FAILURE);
   }
 
   if (sem_init(&sem, 0, 0) == -1)
      handle_error("sem_init");
 
   /* Establish SIGALRM handler; set alarm timer using argv[1] */
 
   sa.sa_handler = handler;
   sigemptyset(&sa.sa_mask);
   sa.sa_flags = 0;
   if (sigaction(SIGALRM, &sa, NULL) == -1)
      handle_error("sigaction");
 
   alarm(atoi(argv[1]));
 
   /* Calculate relative interval as current time plus
      number of seconds given argv[2] */
 
   if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
      handle_error("clock_gettime");
 
   ts.tv_sec += atoi(argv[2]);
 
   printf("main() about to call sem_timedwait()\n");
   while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR)
      continue;       /* Restart if interrupted by handler */
 
   /* Check what happened */
 
   if (s == -1) {
      if (errno == ETIMEDOUT)
            printf("sem_timedwait() timed out\n");
      else
            perror("sem_timedwait");
   } else
      printf("sem_timedwait() succeeded\n");
 
   exit((s == 0) ? EXIT_SUCCESS : EXIT_FAILURE);
}
1
0 / 0 / 1
Регистрация: 02.12.2009
Сообщений: 21
16.01.2011, 07:49  [ТС]
Это стандартный код???И что, как инициализируется??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2011, 07:49
Помогаю со студенческими работами здесь

Переделать программу, чтобы она выполнялась без использования примитива синхронизации Mutex
Необходимо переделать программу так, чтобы она выполнялась без использования примитива синхронизации Mutex. Есть идеи? Буду рад любой...

Синхронизация потоков без объектов ядра - возможно ли?
Нужно решить такую задачу: синхронизировать два потока барьером, с помощью asm вставок в код в более высокоуровневом языке, тоесть будет...

Движение текста без использования потоков - Applet
Здраствуйте,хочу чтобы текст без использовние потоков двигался.У меня вроде получилось.Но как сделать чтобы текст пропадал ,а то он...

Ввод через файл без использования потоков
Добрый день Меня интересует вопрос как сделать ввод через файл без использования потоков. Это вот так или нет? int main() { ...

Одновременное выполнение действий без использования потоков/процессов
Нужно ожидать ввода команды со стандартного потока и в то же время в начале каждого часа вызывать некую функцию ( func назовем). ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru