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

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

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

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

Потоки. Синхронизация. Передача параметра при создании потока.

  • Автор темы sanya923
  • Дата начала
S

sanya923

Здравствуйте!
Разбираюсь с потоками. Возникли проблемы то ли с синхронизацией, то ли с созданием потоков и передачей в потоковую функцию параметров, я конкретно не знал с чем. Ну и в концов замучившись полностью, я решил написать небольшой кодик, всё же с ним легче разбираться.
C++:
#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include "stdlib.h"
using namespace std;


HANDLE sp,uvv[3];

DWORD WINAPI Thread2(LPVOID lpParam1)
{
double t1;
int *i = new int;
*i=*(int*)lpParam1;
while (true)
{
WaitForSingleObject(sp,INFINITE);
cout<<"Potok "<<*i<<endl;  //3
ReleaseSemaphore(sp,1,NULL);
t1=rand();
t1=t1/32678;
t1=3000*t1;
Sleep(unsigned(t1));
}
return 0;
}


VOID main(VOID)
{
int rt; //4
sp=CreateSemaphore(NULL,1,1,NULL);
for (int i=0;i<3;i++)
{
uvv[i]=CreateThread(NULL,0,Thread2,&i,0,NULL);
WaitForSingleObject(sp,INFINITE);		 //1
cout<<"Sozdan prozess "<<i<<endl;
ReleaseSemaphore(sp,1,NULL);			 //2
}
cin>>rt; //5
}
И обнаружил следующее:
Если я коменчу //1 и //2 строчку, то при выводе //3 появляется номер 3, хотя его не должно быть, при тройке же цикл в блок не входит уже, а также выводятся не все номера, т.е. 0,1,2, а два каких-то. Если не коменчу, то всё норм. По логике без них должно же всё нормально работать. В Delphi писал, было всё норм. А также я не пойму как влияет на работу //4 и //51 строчка, если их закоментить, то дохнет.
 
A

a0z

Лень разбираться, что тут зачем, но вот это внушает подозрения
NULL,0,Thread2,&i,0,NULL
Зачем передавать адрес i? Потом в цикле он изменится и поток считает невесть что.
Я так понимаю надо передать потоку его номер. Тогда надо так:
NULL,0,Thread2,(void *)i,0,NULL

а потом считывать:

int i=(int)lpParam1;
 
Мы в соцсетях:

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