69 / 69 / 43
Регистрация: 26.01.2011
Сообщений: 160
1

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

28.01.2011, 10:35. Показов 1351. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Разбираюсь с потоками. Возникли проблемы то ли с синхронизацией, то ли с созданием потоков и передачей в потоковую функцию параметров, я конкретно не знал с чем. Ну и в концов замучившись полностью, я решил написать небольшой кодик, всё же с ним легче разбираться.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#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;
        ReleaseSemaphore(sp,1,NULL);
        t1=rand();
        t1=t1/32678;
        t1=3000*t1;
        Sleep(unsigned(t1));
    }
    return 0;
}
 
 
VOID main(VOID)
{
    int rt;
    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);
              cout<<"Sozdan prozess "<<i<<endl;
        ReleaseSemaphore(sp,1,NULL);
    }
    cin>>rt;
}
И обнаружил следующее:
Если я коменчу 37 и 39 строчку, то при выводе 19 появляется номер 3, хотя его не должно быть, при тройке же цикл в блок не входит уже, а также выводятся не все номера, т.е. 0,1,2, а два каких-то. Если не коменчу, то всё норм. По логике без них должно же всё нормально работать. В Delphi писал, было всё норм. А также я не пойму как влияет на работу 32 и 41 строчка, если их закоментить, то дохнет.

Добавлено через 12 часов 40 минут
Обойти 32 и 41 я не смог, особо понять почему при закоменчивании 37 и 39 непонятные дела происходят, но зато логически переписал по другому. Добавил еще один семафор, чтобы контролировать цикл, раз он раньше каким-то образом убегает вперед, чем создаётся поток.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include "stdlib.h"
using namespace std;
 
 
HANDLE sp,sk,uvv[3];
 
DWORD WINAPI Thread2(LPVOID lpParam1)
{
    double t1;
    int *i = new int;
    *i=*(int*)lpParam1;
    ReleaseSemaphore(sk,1,NULL);
    while (true)
    {
        WaitForSingleObject(sp,INFINITE);
            cout<<"Potok "<<*i<<endl;
        ReleaseSemaphore(sp,1,NULL);
        t1=rand();
        t1=t1/32678;
        t1=3000*t1;
        Sleep(unsigned(t1));
    }
    return 0;
}
 
 
VOID main(VOID)
{
    int rt;
    sp=CreateSemaphore(NULL,1,1,NULL);
    sk=CreateSemaphore(NULL,0,1,NULL);
    for (int i=0;i<3;i++)
    {
                 uvv[i]=CreateThread(NULL,0,Thread2,&i,0,NULL);
                 WaitForSingleObject(sk,INFINITE);
    }
    cin>>rt;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2011, 10:35
Ответы с готовыми решениями:

Передача параметра в потоки
Добрый день уважаемые форумчане! Подскажите как правильно сделать передачу параметров в поток. В...

Передача потока как параметра в функцию
Дорогие форумчане! Повторяю пример из книжки, пока остановился из-за ошибки. //Программа...

Ошибка при создании потока
Почему возникает ошибка: 1&gt;c:\users\егор\desktop\fun_to__\fun_to__\fun+\dir\mainfile.h(17) :...

Abort has been called при создании потока
С помощью CreateRemoteThread запускаю новый поток, в котором примерно следующее: _mainLoop =...

0
28.01.2011, 10:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2011, 10:35
Помогаю со студенческими работами здесь

Ошибка при создании потока std::thread
Внутри класса есть функция void move(); Нужно, чтобы она работала в отдельном потоке. Проблема :...

Неверный тип параметра при вызове функции write потока ofstream
error C2664: std::basic_ostream&lt;_Elem,_Traits&gt;::write: невозможно преобразовать параметр 1 из...

Передача параметра шаблона другому шаблону при использовании
Вопрос довольно сложно поставил, поэтому лучше объясню кодом, возможно ли это или нет. Итак есть...

Передача параметров в конструктор при создании динамического массива
Добрый день! Есть довольно тривиальный класс: class Array1d{ int* ptr_; public: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru