Синхронизация Потоков С Помощью Mutex В C++

Тема в разделе "C/C++/C#", создана пользователем dimka2409, 28 авг 2013.

  1. dimka2409

    dimka2409 New Member

    Регистрация:
    28 авг 2013
    Сообщения:
    4
    Симпатии:
    0
    Задача:
    Отсортировать буквы английского алфавита. Программу разбить на два синхронизированных потока в одном из которых производится ввод букв, а во втором сортировка и вывод на консоль.
    Код (C++):
    #include <windows.h>
    #include <process.h>
    #include <stdio.h>
    #include <conio.h>
    #include <iostream>
    using namespace std;
    HANDLE hMutex;

    void Thread (void* pParams)
    {
    char *I;
    int n,K,i,L,size,j;

    while(true)
    {
    WaidForSingleObject(hMutex, INFINITITE);
    clrscr();
    printf("\nVvedite kolichestvo simvolov");
    cin>>size;
    I=new char[size];
    printf("Vvedite elimenty\n");
    for(j=0;j<size;j++)
    {
    cin>>I[j];
    if(j<size)
    printf("Oshibka vvoda\n");
    }
    ReleaseMutex(hMutex);
    }
    }

    void Thread1 (void* pParams)
    {
    char *I;
    int n,K,i,L,size,j;
    while(true)
    {
    WaidForSingleObject(hMutex, INFINITITE);
    printf("\nSortirovka metodom pryamogo vklucheniya");
    printf("\nIshodniy massiv");
    for(n=0;n<j;n++)
    printf("%2c",I[n]);
    printf("\n");
    for(i=1;i<j;i++)
    {
    K=I[i];
    L=i;
    while(K<I[L-1])
    {
    I[L]=I[L-1];
    L--;
    }
    I[L]=K;
    }
    getch();
    printf("\n Otsartirovannyi massiv:\n");
    for(n=0;n<j;n++)
    printf("%2c",I[n]);
    printf("\n");
    getch();
    closegraph();
    ReleaseMutex(hMutex);
    }
    }

    void main()
    {
    hMutex = CreateMutex( NULL, FALSE, NULL );
    _beginthread( Thread, 0, NULL );
    _beginthread( Thread1, 0, NULL );
    return 0;
    }
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    что именно не получается? - приведенный код не работает?

    обязательно использовать WinAPI? - есть ведь стандартные потоки и мутексы: http://en.cppreference.com/w/cpp/thread/mutex
     
  3. dimka2409

    dimka2409 New Member

    Регистрация:
    28 авг 2013
    Сообщения:
    4
    Симпатии:
    0
    Не компилируется код.
    WinAPI использовать обязательно.
     
  4. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    обычно при этом компилятор сообщает об ошибках.

    мне сходу не понятно что есть closegraph();
    и кажеца, программа может падать на некоторых архитектурах уже потому, что разные потоки одновременно могут попытаться вывести сообщения.

    Код (Text):
    while(true)
    {
    WaidForSingleObject(hMutex, INFINITITE);
    clrscr();
    printf("\nVvedite kolichestvo simvolov");
    cin>>size;
    I=new char[size];
    в вечном цикле выделяется память и не освобождается - полюбому однажды она упадет.


    Собственно не понятно сколько это должно работать - в потоках вечные циклы, но главный поток завершается сразу после создания дочерних потоков (при этом должны принудительно завершиться дочерние потоки, мне кажется).

    Но я не во всем уверен, я WinAPI не использую.

    Да и ваще код странный:

    Код (Text):
    char *I;
    int n,K,i,L,size,j;
    while(true)
    {
    WaidForSingleObject(hMutex, INFINITITE);
    printf("\nSortirovka metodom pryamogo vklucheniya");
    printf("\nIshodniy massiv");
    for(n=0;n<j;n++)
    printf("%2c",I[n]);
    Мы выводим исходный массив, но мы же не выделили под него память в этом потоке и даже не попытались инициализировать его элементы (как, впрочем, и переменную j). Че мы на экран то выводим?

    -------
    PS. Я думаю, вам надо общую память использовать.
    Вы хотите получить готовый код или разобраться?
     
  5. dimka2409

    dimka2409 New Member

    Регистрация:
    28 авг 2013
    Сообщения:
    4
    Симпатии:
    0
    Мне бы хотелось разобраться, код не мой, люди кричат что все работает, у себя запускаю вообще ругается на то что мьютекс не инициализирован, в этом коде не понял ровным счетом ничего, как он может вообще работать. Пользуюсь компилятором VS 2010.
     
  6. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    врут
     
  7. dimka2409

    dimka2409 New Member

    Регистрация:
    28 авг 2013
    Сообщения:
    4
    Симпатии:
    0
    да я уж как то догадывался)
     
  8. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    могу помочь, если вместо WinAPI можно будет использовать стандартную библиотеку (ну ты сам попытаешься задачу решить при этом, хоть чуть-чуть) или Qt или POSIX.
    Но могу решить эту задачу с winAPI за материальное вознаграждение рублей в 700 (у меня линукс, и winAPI я могу использовать только на виртуальной машине {очень неудобно} поэтому только так).
     
  9. Whatka

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    я могу помочь с винапи,если будешь делать сам
    и ещё нужно чётко сформулированное задание(вот мне по условию не ясно когда завершить работу например)
     
Загрузка...

Поделиться этой страницей