Суббота, 04.05.2024, 21:33
СГУ.clan - в помощь студентам!
Главная | Регистрация |Вход Приветствую Вас Школьник | RSS
Меню сайта
ПОИСК ДЛЯ ПРОГРАММИСТОВ
 Google поиск для программистов
Категории каталога
Статьи [22]
Не СГУ [9]
Факультет КНиИТ [340]
Биологический факультет [16]
Географический факультет [31]
Геологический факультет [36]
Институт истории [67]
Механико-математический факультет [190]
Социологический факультет [68]
Фак-т нано и биомедицинских техн... [99]
Факультет нелинейных процессов [36]
Физический факультет [66]
Институт филологии и журналистики [29]
Химический факультет [70]
Экономический факультет [55]
Юридический факультет [31]
Наш опрос
Каких оценок в Вашей зачетке больше?
Всего ответов: 240

Напоминаем, что если необходимый Вам файл был удален с сервера DepositFiles (за исключением просьбы автора), то Вы можете написать в комментарии о необходимости в данном файле. В ближайшее время он будет перезалит (при возможности на сервер сайта).

Главная » Файлы » Статьи [ Добавить материал ]

Работа с Mutex в Си\C++
[ ] 02.12.2008, 20:25
Рассмотрим простую задачу, наглядно показывающую как работать с потоками, используя mutex. Задача довольна проста. Есть один общий счетчик и пять потоков. Каждый поток уменьшает данный счетчик на единицу, спит секунду и повторяет свои действия. Выполнение операций продолжается до тех пор, пока счетчик не будет равен нулю.

Code
#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>

int p=12; // Наш счетчик
int flag[5]; // Служит для вывода на экран сообщения какой поток
  // уменьшил счетчик на единицу
pthread_t thread[5]; // Объявляем пять потоков
pthread_mutex_t mutex; // Объявляем mutex

void*potok(void*arg) // Функция потока
{
  int j = (int) arg;
  flag[j-1]=j;
  while(p>0)
  {
  pthread_mutex_lock(&mutex); // Блокируем mutex
  if(p>0)
  {
  int k = p-1;
  printf("P(%d)=%d\n",flag[j]+1,k);
  p = k;
  }
  pthread_mutex_unlock(&mutex); // Освобождаем mutex
  sleep(1); // Спим секунду
  }
}

int main()
{
  int i;
  pthread_mutex_init(&mutex,NULL); // Инициализация mutex
  for(i=0;i<5;i++)
  pthread_create(&thread[i],NULL,potok,(void*)i);
  for(i=0;i<5;i++)
  pthread_join(thread[i],NULL); // Ждем выполнения потоков, так как функция
  // main завершается раньше чем потоки
  return 0;
}
Категория: Статьи |
Просмотров: 2950 | Загрузок: 0 | Комментарии: 1 | Рейтинг: 3.0/1 |

Данный файл Вам очень помог? Вы можете отблагодарить автора!

Всего комментариев: 1
1 thor  
0
чтото больно много лишних сущностей ввиде локальных переменных и глобальных, я бы выкинул масив flag[]
Code

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

#define THREADS 5 // сколько потоков

pthread_mutex_t mut; // наш мутех
int count=100; // наш глобальный счетчег

void *func(void *argc){ // то, что запускаем в потоке
  while (count>0) {
  pthread_mutex_lock(&mut);
  printf("%d by %d thread\n", count, (int)argc); // выводит счетчег и id потока
  count--;
  pthread_mutex_unlock(&mut);
  sleep(1);
  }
  return NULL;
}

int main(int argc, char **argv){
  pthread_t threads[THREADS]; // масив дескрипторов потоков
  int i=0;
  pthread_mutex_init(&mut, NULL);
  for (;i<THREADS;i++){
  pthread_create(&threads[i],NULL, func, (void *)i); // запускать потоки!
  }
  for (i=0;i<THREADS;i++){
  pthread_join(threads[i], NULL); // ждать завершения всех потоков
  }
  printf("count=%d\n",count); // выведет наш счетчег, он должен быть равен 0
  return 0;
}

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа


Правильные покупки

Поиск
Друзья сайта


Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright СГУ.clan © 2024