Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
sanya923
69 / 69 / 19
Регистрация: 26.01.2011
Сообщений: 160
#1

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

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

Здравствуйте!
Разбираюсь с потоками. Возникли проблемы то ли с синхронизацией, то ли с созданием потоков и передачей в потоковую функцию параметров, я конкретно не знал с чем. Ну и в концов замучившись полностью, я решил написать небольшой кодик, всё же с ним легче разбираться.
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.01.2011, 10:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Потоки. Синхронизация. Передача параметра при создании потока. (C++):

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

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

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

Abort has been called при создании потока - C++
С помощью CreateRemoteThread запускаю новый поток, в котором примерно следующее: _mainLoop = std::thread(() { for (;;) { ...

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

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

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2011, 10:35
Привет! Вот еще темы с ответами:

Передача параметра шаблона другому шаблону при использовании - C++
Вопрос довольно сложно поставил, поэтому лучше объясню кодом, возможно ли это или нет. Итак есть класс. Назовем его A: class A { ...

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

Передача значения параметра из одного класса в другой при разных хедерах - C++
Всем здравствуйте! Застопорился над одним вопросом... Был бы очень благодарен за помощь! Суть: Нужно передать значение параметра из...

Получение параметра из потока win32api c++ - C++
Задача заключается в том,что мне присылают в main в качестве параметров количество потоков,и аргумент. Этот аргумент нужно в потоке...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.