Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
2 / 2 / 0
Регистрация: 03.03.2013
Сообщений: 37

Параллельные потоки (создание, синхронизация без ожидания и мьютексов)

14.02.2015, 11:18. Показов 1962. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Выполняю лабораторную работу, вот задание
Задание
Напишите программу на языке C/C++, в которой:
1) Запускается четное количество потоков параллельно.
2) Каждый нечетный поток (например, первый) создает файл с именем из
своего PID, записывает в него произвольное число символов (от не-
скольких символов до сотен миллионов символов) и закрывает этот
файл.
3) Каждый четный поток (например, второй) открывает файл, созданный
предыдущим потоком с нечетным номером (в нашем случае первым),
читает его, считает количество символов в файле и закрывает его; при
этом четный поток не должен иметь никакой информации о количест-
ве записываемых в файл символов и о том, закончена ли запись в файл
нечетным потоком.
4) Каждый из потоков выводит следующую информацию: ThreadID, PID,
PPID, время, имя файла, количество записанных или считанных сим-
волов.
5) Количество пар создаваемых потоков передается аргументом в про-
грамму с командной строки. Программа должна ждать завершения
работы всех потоков, анализировать и сообщать о причинах заверше-
ния потоков. Для передачи имен файлом между потоками можно ис-
пользовать символьный массив в основной программе.

Написал функции Создания и Чтения файлов
C++ (Qt)
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
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
 
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <dirent.h>
 
char** files; // массив с именами файлов
 
void* create_file(void *arg) // поток создания файла
{
    int* tmp =(int*) arg; // индекс указывающий на имя файла
    int ind = *tmp;
    int rec_error;
    delete tmp;
 
    FILE* fl;
    long unsigned int PID;
    int pid, ppid, num;
    long unsigned int len, i = 0;
    char buf;
    time_t vremya= time(NULL);
    num = ind*2 + 1; // номер потока
    len = random(); // количество символов в файле
    PID = pthread_self(); // ThreadID
    pid = getpid(); // PID
    ppid = getppid(); // PPID
    sprintf(files[ind], "%s/%lu%s", getenv("PWD"), PID, ".txt"); // имя файла
    fl = fopen(files[ind], "w");// создаем файл
    if( fl ) // если файл создан
    {
        while( i!=len) // пока не запишем все символы
        {
            if( i % 2 ) buf = '0';
            else buf = '1';
            fputc(buf, fl);
            i++;
        } 
        if( fclose(fl) == EOF) printf("Fclose Error"); // закрываем файл
    }
    // выводим на экран информацию о потоке и файле
    printf("\nThread #%i\n\tThreadID: %lu\n\tPID: %i\n\tPPID: %i\n\tTimeDate: %s\tFileName: %s\n\tLength: %lu\n", num, PID, pid, ppid, ctime(&vremya), files[ind], len);
    pthread_exit(NULL);
}
 
void* read_file(void *arg) // поток читающий файл
{
    int* tmp =(int*) arg; // индекс указывающий на имя файла
    int ind = *tmp;
    delete tmp;
    FILE* fl;
    long unsigned int PID;
    int i = 0, pid, ppid, num;
    long int len = 0;
    //char t[32];
    char buf[256];
    time_t vremya= time(NULL);
    num = ind*2 + 2;
    PID = pthread_self(); // ThreadID
    pid = getpid(); // PID
    ppid = getppid(); // PPID
    fl = fopen(files[ind], "r"); // открываем файл для чтения
    if( fl ) // если файл открылся
    {
        strcpy(buf, files[ind]); // считываем название файла
        while( i!=EOF ) // пока не достигнем конца файла
        {
            i = fgetc(fl); // считываем по-символьно
            if( i!=EOF ) len++; // счетчик символов
        }
        if( fclose(fl) == EOF) printf("Fclose Error"); // закрываем файл
    }
    else // если файла нет
    {
        strcpy(buf, "file not found");
    }
    // выводим результаты работы
    printf("\nThread #%i\n\tThreadID: %lu\n\tPID: %i\n\tPPID: %i\n\tTimeDate: %s\tFileName: %s\n\tLength: %lu\n", num, PID, pid, ppid, ctime(&vremya), buf, len);
    pthread_exit(NULL);
}
 
// запускаем приложение
int main(int argc, char* argv[])
{
}
{
А вот как дальше с потоками(создание, синхронизация без ожидания и мьютексов) не могу разобраться.
Помогите, кто может?

Добавлено через 1 минуту
Сам пытался сделать, вот что получилось
нужна синхронизация без ожидания и мьютексов.
вот как ее сделать незнаю
C++ (Qt)
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
int main(int argc, char* argv[])
{
    int i, qnt, res, tmp;
    FILE* fl;
    pthread_t* ws;
    pthread_t* rs;
    srandom(time(NULL));
    if( argc == 2 ) qnt = atoi(argv[argc-1]); // выбираем количество пар потоков из командной строки
    else qnt = 0;
    if( qnt ) // если в командной строке прописано количество пар потоков
    {
        ws = new pthread_t[qnt]; // создаем указатели на потоки записи
        rs = new pthread_t[qnt]; // создаем указатели на потоки чтения
        files = new char*[qnt]; // создаем массив имен файлов
        for(i=0; i<qnt;i++)
        {
            files[i] = new char[256]; // инициализируем строку имени файла
            res = pthread_create(&ws[i], NULL, create_file, new int(i)); // запускаем нечетный поток
            if (res != 0) // проверка на успех
            {
                perror("creation failed");
                exit(EXIT_FAILURE);
            }
            res = pthread_create(&rs[i], NULL, read_file, new int(i)); // запускаем четный поток
            if (res != 0) // проверяем
            {
                perror("Thread creation failed");
                exit(EXIT_FAILURE);
            }
        }
        // проверяем завершение потоков, а так же удаляем файлы и очищаем память
        for(i=qnt-1; i>=0; i--)
        {
            tmp = i*2+1;
            res = pthread_join(ws[i], NULL);
            if (res == 0) printf("Picked up a thread #%i\n", tmp);
            else perror("pthread_join failed");
            tmp = i*2+2;
            res = pthread_join(rs[i], NULL);
            if (res == 0) printf("Picked up a thread #%i\n", tmp);
            else perror("pthread_join failed");
            if(remove(files[i])) printf("Error removing file");
 
            delete [] files[i];
        }
 
        delete [] files;
        delete [] ws;
        delete [] rs;
    }
 
    printf("All done\n");
    exit(EXIT_SUCCESS);
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2015, 11:18
Ответы с готовыми решениями:

синхронизация процессов с использованием мьютексов
помогите, не могу найти информацию для работы с мьютексами для синхронизации процессов

Синхронизация процессов при помощи мьютексов
начал разбираться с мбютексами, а точнее как синхронизировать 2 рпоцесса с их помощью. #include &lt;stdlib.h&gt; #include...

Параллельные процессы, их синхронизация.
Нужно каким-то образом внутри одного параллельного потока (TThread) узнать (скопировать) некоторое свойство другого потока или формы (в...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2015, 11:18
Помогаю со студенческими работами здесь

Параллельные потоки
Доброй ночи! необходимо написать пример, показывающий параллельную активность потоков. вот если я сделаю так: class Thread_1 :...

Параллельные потоки
Может кто-нибудь подсказать, как написать программу, в которой с какой-то определенной точки работают параллельно, например, три потока?...

Параллельные потоки в QT
Здравствуйте! Я новичок в QT,ранее почти не работал с потоками, хотелось бы навести справки как правильно пользоваться...

Параллельные потоки
Доброго времени суток, знатоки! Есть задача, написать программу, со сложными и объемными вычислениями, я не хочу нагружать никого, по...

Таймер и параллельные потоки
Добрый день, сразу оговорюсь, что прошёлся поиском по темам с запросом &quot;таймер&quot;, &quot;потоки&quot; и т.д. Разрабатываю...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru