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

  • 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Синхронизация Потоков С Помощью 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;
}
 
R

rrrFer

что именно не получается? - приведенный код не работает?

обязательно использовать WinAPI? - есть ведь стандартные потоки и мутексы:
 
R

rrrFer

Не компилируется код.
обычно при этом компилятор сообщает об ошибках.

мне сходу не понятно что есть 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. Я думаю, вам надо общую память использовать.
Вы хотите получить готовый код или разобраться?
 
D

dimka2409

Мне бы хотелось разобраться, код не мой, люди кричат что все работает, у себя запускаю вообще ругается на то что мьютекс не инициализирован, в этом коде не понял ровным счетом ничего, как он может вообще работать. Пользуюсь компилятором VS 2010.
 
R

rrrFer

могу помочь, если вместо WinAPI можно будет использовать стандартную библиотеку (ну ты сам попытаешься задачу решить при этом, хоть чуть-чуть) или Qt или POSIX.
Но могу решить эту задачу с winAPI за материальное вознаграждение рублей в 700 (у меня линукс, и winAPI я могу использовать только на виртуальной машине {очень неудобно} поэтому только так).
 
W

Whatka

я могу помочь с винапи,если будешь делать сам
и ещё нужно чётко сформулированное задание(вот мне по условию не ясно когда завершить работу например)
 
Мы в соцсетях:

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