• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

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

  • Автор темы Автор темы dimka2409
  • Дата начала Дата начала
D

dimka2409

Задача:
Отсортировать буквы английского алфавита. Программу разбить на два синхронизированных потока в одном из которых производится ввод букв, а во втором сортировка и вывод на консоль.
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;
}
 
что именно не получается? - приведенный код не работает?

обязательно использовать WinAPI? - есть ведь стандартные потоки и мутексы:
 
Не компилируется код.
обычно при этом компилятор сообщает об ошибках.

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

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


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

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

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

Код:
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. Я думаю, вам надо общую память использовать.
Вы хотите получить готовый код или разобраться?
 
Мне бы хотелось разобраться, код не мой, люди кричат что все работает, у себя запускаю вообще ругается на то что мьютекс не инициализирован, в этом коде не понял ровным счетом ничего, как он может вообще работать. Пользуюсь компилятором VS 2010.
 
могу помочь, если вместо WinAPI можно будет использовать стандартную библиотеку (ну ты сам попытаешься задачу решить при этом, хоть чуть-чуть) или Qt или POSIX.
Но могу решить эту задачу с winAPI за материальное вознаграждение рублей в 700 (у меня линукс, и winAPI я могу использовать только на виртуальной машине {очень неудобно} поэтому только так).
 
я могу помочь с винапи,если будешь делать сам
и ещё нужно чётко сформулированное задание(вот мне по условию не ясно когда завершить работу например)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!