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

Тема в разделе "Общие вопросы по С и С++", создана пользователем sanya923, 27 янв 2011.

  1. sanya923

    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 строчка, если их закоментить, то дохнет.
     
  2. a0z

    a0z Well-Known Member

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

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

    int i=(int)lpParam1;
     
Загрузка...
Похожие Темы - Потоки Синхронизация Передача
  1. Mady
    Ответов:
    3
    Просмотров:
    1.475
  2. 203
    Ответов:
    4
    Просмотров:
    1.752
  3. Senset
    Ответов:
    0
    Просмотров:
    2.331
  4. makaset
    Ответов:
    1
    Просмотров:
    616
  5. lorpeace
    Ответов:
    0
    Просмотров:
    625

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