Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5

Работа с потоками

30.03.2013, 22:32. Показов 3184. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Имеется такое задание:
Создать 2 исполняемых модуля(exe-файла). Первый модуль только запускает второй(exe файл). Вся остальная логика сосредоточена во втором мудуле,
в нем необходимо запустить 3 потока в каждом из которых завести отдельный счетчик и увеличивать его на единицу. После, завершить все потоки, предварительно вывести на консоль значени счетчиков.
Лаунчер написал такой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// Launcher.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <Windows.h>
 
 
int main()
{
    WinExec("Child.exe #1\0", SW_SHOWNORMAL);
    getchar();
    return 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
42
43
44
45
46
// Child.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <Windows.h>
#include <strsafe.h>
#define N 3
 
DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
    int counter  = rand() % 100;
    counter++;
    printf("Thread #%i, counter value was %i, new value is %i\n", *((int*)lpParam), counter - 1, counter);
    return 0;
}
 
int main(int argc, _TCHAR* argv[])
{
    int i, *data[N];
    HANDLE  hThreadArray[N]; 
    printf("Launched %s\n", argv[1]);
    for(i = 0; i < N; i++)
    {
        data[i] = (int*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int));
        *data[i] = i;
        hThreadArray[i] = CreateThread(0,0,MyThreadFunction,data,0,0);
        if (hThreadArray[i] == NULL) 
        {
            printf("Failed to create a thread #%i",i);
            ExitProcess(3);
        }
    }
    WaitForMultipleObjects(N, hThreadArray,TRUE,INFINITE);
 
    // Close all thread handles and free memory allocations.
    for(int i=0; i<N; i++)
    {
        CloseHandle(hThreadArray[i]);
        if(data[i] != NULL)
        {
            HeapFree(GetProcessHeap(), 0, data[i]);
            data[i] = NULL;   
        }
    }
    return 0;
}
Но почему-то получается такая фигня, что номер потока и значения счетчика одни и те же (хотя я старался, чтобы была атомарность операции вывода результата, но не вижу тут необходимости в синхронизациях, разве что для рандома, но на имя потока он-то не влияет!), в чем может быть фигня?
Миниатюры
Работа с потоками  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.03.2013, 22:32
Ответы с готовыми решениями:

Работа с потоками
Добрый день, нужна помощь: нужно переделать код под винду, помогите пожалуйста. #include &lt;stdio.h&gt; #include &lt;pthread.h&gt; ...

Работа с потоками
Здравствуйте. нужно доработать программу чтобы я вводил количество потоков. предположим что это программа Поставщик-Потребитель...с...

Работа с двумя потоками
Задаются две маски файлов. Первая маска - это маска директорий, вторая - это маска файлов. Также задается начальный каталог работы. После...

1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
30.03.2013, 23:22  [ТС]
Не знаю, в чем был прикол, в итоге так сделал:
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
42
43
44
45
46
47
48
// Child.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <Windows.h>
#include <strsafe.h>
#define N 3
 
DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
    int i = *((int*)lpParam);
    i++;
    printf("Thread #%i, counter value was %i, new value is %i\n", GetCurrentThreadId(), i - 1, i);
    return 0;
}
 
int main(int argc, _TCHAR* argv[])
{
    int i, *data[N];
    HANDLE  hThreadArray[N]; 
    srand(512 ^ atoi((char*)argv[1]));
    printf("Launched %s\n", argv[1]);
    for(i = 0; i < N; i++)
    {
        data[i] = (int*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(int));
        *data[i] = rand() % 100;
        hThreadArray[i] = CreateThread(0,0,MyThreadFunction,data[i],0,0);
        if (hThreadArray[i] == NULL) 
        {
            printf("Failed to create a thread #%i",i);
            ExitProcess(3);
        }
    }
    WaitForMultipleObjects(N, hThreadArray,TRUE,INFINITE);
 
    // Close all thread handles and free memory allocations.
    for(int i=0; i<N; i++)
    {
        CloseHandle(hThreadArray[i]);
        if(data[i] != NULL)
        {
            HeapFree(GetProcessHeap(), 0, data[i]);
            data[i] = NULL;   
        }
    }
    printf("\r\n");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.03.2013, 23:22
Помогаю со студенческими работами здесь

Работа с потоками CreateThread
Нужно считывать параметры с сом порта каждые 10 с. При нажатии кнопки завершать поток.В самом теле функции почти ничего не выполняется и по...

Работа с потоками с разными приоритетами
Дали такое задание: Напишите программу, которая создает один поток и позволяет пользователю изменять приоритет процесса и потока и...

Работа с процессами и потоками в Windows
Создать приложение, запускающее пять дочерних потоков. Каждый поток выполняет вывод сообщения об уровне своего приоритета, а затем выводит...

Работа с потоками
Нужно посчитать сумму элементов в матрице nxn написал а она мне выдаёт ошибку. и теперь не знаю что надо делать. ...

Работа с потоками в C++.
Добрый день. Есть задача - создать приложение, на C++, работающее с несколькими потоками (дескать, это разумно. Типа &quot;нужно бы не...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru