Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 04.10.2018
Сообщений: 85
1

Создание потока

24.10.2018, 12:30. Просмотров 805. Ответов 1
Метки нет (Все метки)

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

Нужно исправить, все работает, но препрод говорит, что тут три потока, еще и main, нужно как-то чтобы дочерний запускал родительский.

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include"stdafx.h"
#include<iostream>
#include<windows.h>
#include<string>
#include<io.h>
#include<thread> //для работы с потоками 
#include<mutex>
#include<fstream>
using namespace std;
 
//ДЕСЯТЬ СТРОК
enum ConsoleColor
{
    Black = 0, //просто цвета
    Blue = 1,
    Green = 2,
    Cyan = 3,
    Red = 4,
    Magenta = 5,
    Brown = 6,
    LightGray = 7,
    DarkGray = 8,
    LightBlue = 9,
    LightGreen = 10,
    LightCyan = 11,
    LightRed = 12,
    LightMagenta = 13,
    Yellow = 14,
    White = 15
};
void SetColor(ConsoleColor text, ConsoleColor background)
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);  //Изменение цвета в консоли 
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 4) | text));
}
 
void parent(ifstream &file, mutex &mtx)
{
    string str;
    while (!file.eof()) //Пока не пройдет весь файл 
    {
        mtx.lock(); //Блокирует мьютекс
        for (int i = 0; i < 2; i++) //Сколько строк должно быть выведено
        {
            if (file.eof()) //поиск на наличие символов 
                break;
            getline(file, str); //Получение строки из файла
            SetColor(LightBlue, Black);
            cout << "\tРодительский процесс: " << str << endl;
            SetColor(White,Black );
        }
        mtx.unlock(); //Разблокирует мьютекс, чтобы начался дочерний процесс
        Sleep(1000); //приостановка программы
    }
}
 
void child(ifstream &file, mutex &mtx)
{
    string str;//строковая переменная 
    while (!file.eof())//проверочка на наличие строк 
    {
        mtx.lock(); //Блокирует мьютекс
        for (int i = 0; i < 3; i++) //Сколько строк должно быть выведено
        {
            if (file.eof())//если файл пуст
                break;
            getline(file, str);//Получение строки из файла
            SetColor(Blue, Black);
            cout << "Дочерний процесс: " << str << endl;//Вывод 
            SetColor(White, Black);
        }
        mtx.unlock(); //Разблокирует мьютекс, чтобы начался родительский процесс
        Sleep(1000);//приостановка программы
    }
}
 
int main()
{
    setlocale(LC_ALL, "rus");//Подключение русского языка 
    mutex mtx; //Переменная типа мьютекс
    ifstream file("1.txt"); //Открытие файла для чтения строк
    SetColor(Red, Black);
    if (!file.is_open())//проверка наличия файла 
    
        cout << "Файл не существует!";
        
    else if (file.peek() == EOF)//проверка на наличие строк
        cout << "Файл пуст!";
    
    else
    {
        thread t1(parent, ref(file), ref(mtx)); //Запуск потоков и передача параметров
        thread t2(child, ref(file), ref(mtx));
        t1.join(); //Ожидает завершения потока 
        t2.join();
    }
    file.close();//закрытие файла 
    cout << endl;
    SetColor(White, Black);
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2018, 12:30
Ответы с готовыми решениями:

Создание потока из потока.
Надо создать поток 1, в нем создать поток 2, сам я жуткий дураг, немаловероятно что правильного в...

Создание потока
В общем дело такое, есть функция main, само собой, и есть функция void music (), void music () {...

Создание потока
Доброй всем ночи! Перерыскал cplusplus.com, но так и не разобрался. Может ли кто-нибудь...

Создание потока в классе
Всем здрасьте ! Меня волнует вопрос: Как создать поток в классе ? Находил много реализаций,...

1
3310 / 2689 / 727
Регистрация: 25.03.2012
Сообщений: 9,716
Записей в блоге: 1
24.10.2018, 13:27 2
в чём проблема? тупо запускай parent как обычную функцию,
C++
1
2
        thread t2(child, ref(file), ref(mtx));
        parent(file, mtx);
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.10.2018, 13:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Создание нового потока
Вот тут выдаёт ошибку. DWORD thID; CreateThread(NULL,NULL,SexToClient, ...

Рекурсивное создание потока
написал пример вызова. но только вот отрабатывает вся эта ерунда не совсем верно. нужно: создать...

Создание потока ввода
Объясните, плиз, почему не получается инициализировать поток ввода внутри оператора switch ? код...

Создание консоли для потока
Вомзожно ли создать несколько консолей для одного процесса ? Хотелось бы каждому потоку выделить...


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

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

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