Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под *nix > C++ на Unix
Перезагрузить страницу Синхронизация потоков как сделать
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Sergey727 Sergey727 вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.12.2010
По умолчанию Синхронизация потоков как сделать - 08.12.2010, 12:23

Помогите пожалуйста лабу переделать
__________________________________________________ ____
Разработать программу, имитирующую соревнования гоночных автомобилей. Гоночный заезд включает в себя три этапа, очередной этап начинается после того, как все автомобили завершат предыдущий этап. Победитель определяется по итогам всех трех этапов. После того, как последний автомобиль достигнет финиша, производится подсчет баллов и распределение мест.
В гонках принимают участие пять автомобилей. Система начисления баллов определяется разработчиком. Необходимо также разработать интерфейс, позволяющий следить за ходом гонок в наглядной форме. В конце соревнования вывести его итоги, включающие в себя:
- расстановку машин по местам в итоге соревнований;
- набранные каждым участником баллы.
2. Гоночный автомобиль моделируется отдельным процессом. Процессы выполняются параллельно. Необходим также одни управляющий процесс, который запускает остальные процессы и отслеживает момент их завершения, а затем подсчитывает и выводит на экран итоги.
3. Для решения задачи необходимо использовать барьерную синхронизацию. Для реализации барьера можно воспользоваться массивом, каждый элемент которого соответствует состоянию одного процессов, моделирующих гоночные автомобили.
4. Рекомендуемые функции языка C: ftok, msgget, msgsnd, msgrcv msgctl.
Ответить с цитированием
  (#2 (permalink)) Старый
Sergey727 Sergey727 вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 08.12.2010
По умолчанию 08.12.2010, 12:32

cpp Код:
//g++ gonki.cpp -D_REENTERANT -I/usr/include/nptl -L/usr/lib/nptl -lpthread -o gon
#include <pthread.h>
#include <stdio.h> // ?
#include <stdlib.h>
//#include <sys/stat.h>
#include <time.h>
#include <unistd.h> // dlja sleep
#include <sys/types.h> // dlja soobshenii
#include <sys/ipc.h>   // - // -
#include <sys/msg.h>   // - // -
#include <string.h>   // dlja strcat

#define KOL_CAR   5
#define KOL_ZAEZD 3

pthread_barrier_t id_bar;   // id bar`er
//-----------
struct car
{
    double    score[4];
    char   *marka;
    int    id_car;
    double time[4];
};
//--------- messages -------------
struct car_msg_buff {
    long   mtype;
    int    car_number;
    double zaezd_time;
} ;
//----------
struct car avto[5];
int msqid;
pthread_mutex_t id_mut;
//----------- peredaetsja v f-jy ------------
struct for_zaezd
{
    int num_car;
    int num_z;
} ;
//______________________ vuvod mest ___________________________________
void print_mesta(int num_zaezd)
{
    struct car buff_car;
    bool   find = true;
    char st[4];//,*file_name = "rezult_";
        char name[9] = "rezult_";    
    char *file_rez;
    FILE *ff;
     
     
    if (num_zaezd == KOL_ZAEZD)      // itog
    {
     for (int i=0; i<KOL_CAR; i++)
      for (int j=0; j<KOL_ZAEZD; j++)
      {
          avto[i].score[num_zaezd] += avto[i].score[j];
      avto[i].time[num_zaezd] += avto[i].time[j];
      }
      file_rez = strcat(name,"itoG");
    }
    else
    {
        sprintf(st,"%i",(num_zaezd+1));
    file_rez = strcat(name,st);

    }
     
    ff = fopen(file_rez,"w");

// _____ sortirovka _____    
    while (find)
    {
    find = false;
    for (int i = 0; i<(KOL_CAR-1); i++)
    {
    if (avto[i].score[num_zaezd] < avto[i+1].score[num_zaezd]) {
        buff_car = avto[i];
        avto[i] = avto[i+1];
        avto[i+1] = buff_car;
        find = true;
        }
    }
    }
// __________________
char *s;
    if (num_zaezd != KOL_ZAEZD)
{  
  s = "Raspredelenie mest:\n";
  printf(s,(num_zaezd+1));
  fprintf(ff,s,(num_zaezd+1));
}
else
{
 s = "\nRezultat\n";
 printf(s);
 fprintf(ff,s);
}
//---------- pechat rezyltata -------------
         
s = "mesto    id_avto    ochki    vremya\n";      
    //  printf(s);
        fprintf(ff,s);
            s = "  %i         %i      %5.0f       %4.2f\n\n";    
    for (int i=0; i<KOL_CAR; i++)
    {
    printf("Car s id %i finishirovala so vremem %4.2f i poluchila %5.0f\n",avto[i].id_car,avto[i].time[num_zaezd],avto[i].score[num_zaezd]);
     fprintf(ff,s,(i+1), avto[i].id_car, avto[i].score[num_zaezd],avto[i].time[num_zaezd]);    
    }
 s = "-----------------------------------------------------------------\n";    
 printf(s);
 fprintf(ff,s);
}

//_______________________ start zaezd ! _______________________________
void* zaezd(void *arg )
{
    struct for_zaezd z = * (for_zaezd *) arg;
    struct car_msg_buff buff ;
    int length = sizeof(int) + sizeof(double);
    struct timespec tm;

    int nsec = rand()% 99+1;   //  1=<x=<99
    int sec = rand()% 2+1;

    tm.tv_sec = sec;
    tm.tv_nsec = nsec*10000000;

    buff.car_number = z.num_car;    // otpravka soobshenija
    buff.zaezd_time = sec + nsec*0.01;
    buff.mtype = 1;
//----_____----_____------
    pthread_barrier_wait(&id_bar);
//----_____----_____-----
    nanosleep(&tm,&tm);
     
    pthread_mutex_lock(&id_mut);
    if (( msgsnd(msqid,(struct msgbuf *) &buff, length, 0))<0)   printf("Oshibka otpravki soobsteniya\n");
    pthread_mutex_unlock(&id_mut);
     
    return NULL;
}
//___________________________________________________
main()
{
    long nowtime;
    time(&nowtime);
    srand(nowtime);
    int length_msg = sizeof(int) + sizeof(double);
     
    pthread_t           id_thread[KOL_CAR];
    struct for_zaezd    nowZ[KOL_CAR];
    struct car_msg_buff rsv_buff;
    int res;
     
    pthread_barrier_init(&id_bar, NULL,  KOL_CAR); // sozdanie bar`era
    for (int i=0; i<KOL_CAR; i++)    avto[i].id_car = i;
//  ------------ sozd. o4ered soobshenii ------------
key_t key = ftok("gonki.cpp",2);
if ((msqid = msgget(key,0666|IPC_CREAT))<0)
{
    printf("msgget error! \n");
    exit(1);
} ;
 pthread_mutex_init(&id_mut,NULL);
//   --------------- zapysk potokov --------------
for (int j=0; j<KOL_ZAEZD; j++) {
 for (int i=0; i<KOL_CAR; i++)                  
 {
    nowZ[i].num_car = i;
    nowZ[i].num_z = j;                      // nomer zaezda
    res = pthread_create( &id_thread[i], NULL, zaezd,   &nowZ[i]);
        if (res!= 0)    {
        printf("oshibka sozdaniya potoka\n");
    exit(1);
    }
 };

printf("Start! Krug #%i \n", j+1 );

//  ----- zavershenie potokov --------------------
for (int i=0; i<KOL_CAR; i++)
{
    res = pthread_join(id_thread[i], NULL);
    if (res!= 0)    {
   printf("Potok ne zavershen\n");
    exit(1);
    }
/*printf("Car %i finishirovala \n",i+1);*/
}
/*printf ("Zhdem raspredekeniya ochkov za tekutsii krug\n");
sleep (3);*/

//--------- 4tenie soobshenii is ocheredi ----------
for (int i = (KOL_CAR-1); i>-1; i--)
{            
    if ((msgrcv(msqid,(struct msgbuf *) &rsv_buff, length_msg,  0,  0))<0)    {
    printf("msg vernul oshibku!\n");
    exit(1);
        }
    else
    {
    avto[rsv_buff.car_number].score[j] = i;
    avto[rsv_buff.car_number].time[j]  = rsv_buff.zaezd_time;
    }    
}
print_mesta(j);          
}    
//------------------------------------------------
printf("Gonka zavershena");
print_mesta(KOL_ZAEZD);      
//------------------------------------------------
pthread_barrier_destroy(&id_bar);
if ((msgctl(msqid,IPC_RMID,(struct msqid_ds *)NULL))<0)
printf("Oshibka udaleniya soobsteniya\n");
else printf("Soobtseniya udaleny uspeshno\n");
    printf("Zaversheno\n");
return 0;
}

вот код программы, препод зарубил, типа управление потоками дложно быть ручным. Что подразумевала она не понятно, подскажите хоть что нибуть
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows 7 Синхронизация Wmp 12 anduda Windows 7 0 08.11.2011 14:49
синхронизация WMP 12 Windows 7 anduda Любые вопросы от новичков 0 07.11.2011 03:28
Выборочная синхронизация потоков sercher81 WinAPI 1 13.07.2011 21:17
Синхронизация потоков стандарте C/C++ Odin_KG С/С++ 6 25.04.2011 14:16
Синхронизация. Extensa Любые вопросы от новичков 4 17.04.2011 12:05
Создание потоков на C++ Builder vilru C++ Builder 6 25.02.2009 12:23
Синхронизация потоков в MFC Dialog Based Application приложении Sash&#39;Ok&#33; Visual C++ 8 17.05.2007 16:00
Как организовать пул потоков Leonidos_ С/С++ 4 04.05.2007 12:49
Синхронизация потоков на приложении Fuud Delphi 5 11.02.2007 18:18
Создание потоков в приложении |ina C++ Builder 9 15.07.2006 17:46
Как работать с замораживанием потоков Smolnyj WinAPI 14 17.03.2006 21:52
Получение видео потоков Anonymous Программирование графики 3 17.01.2004 19:29



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов