S
sanya923
Здравствуйте!
Разбираюсь с потоками. Возникли проблемы то ли с синхронизацией, то ли с созданием потоков и передачей в потоковую функцию параметров, я конкретно не знал с чем. Ну и в концов замучившись полностью, я решил написать небольшой кодик, всё же с ним легче разбираться.
И обнаружил следующее:
Если я коменчу //1 и //2 строчку, то при выводе //3 появляется номер 3, хотя его не должно быть, при тройке же цикл в блок не входит уже, а также выводятся не все номера, т.е. 0,1,2, а два каких-то. Если не коменчу, то всё норм. По логике без них должно же всё нормально работать. В Delphi писал, было всё норм. А также я не пойму как влияет на работу //4 и //51 строчка, если их закоментить, то дохнет.
Разбираюсь с потоками. Возникли проблемы то ли с синхронизацией, то ли с созданием потоков и передачей в потоковую функцию параметров, я конкретно не знал с чем. Ну и в концов замучившись полностью, я решил написать небольшой кодик, всё же с ним легче разбираться.
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 строчка, если их закоментить, то дохнет.