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

Подсчет символов из файла с помощью дополнительного потока

05.06.2012, 08:22. Показов 1349. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вообщем надо мне сделать программу которая создает 2 потока. Один записывает файл в память(причем блоками), а другой сразу читает из памяти и обрабатывает
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
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <errno.h>
#define BUFSIZE 1
void* write_thread (void*);
void* read_thread (void*);
char buffer[BUFSIZE];
int isexit = 0;
int x;
pthread_mutex_t my_sync; // Инициализируем мьютекс
 
void print (const char * x)
{
printf("\t%s\n", x);
}
 
int main ()
{
pthread_t tid1, tid2; // Инициализация потоков
pthread_mutex_init (&my_sync, NULL); // Инициализация мьютекса
pthread_create (&tid1, NULL, write_thread, (void *) NULL); // Создаем поток записи
pthread_create (&tid2, NULL, read_thread, (void *) NULL); // Создаем поток чтения
pthread_join (tid1, NULL); // Ждем завершения потоков
pthread_join (tid2, NULL);
}
void* write_thread (void* dummy) // Функция записи
{
FILE * fd = fopen("file2_.txt", "r");
if (fd == NULL)
{
print("Ошибка при открытии файла");
return 0;
}
print("Происходит запись в память");
while(!feof(fd))
{
<--- здесь нужно ждать первый мьютекс
pthread_mutex_lock(&my_sync); // Захватываем мьютекс — здесь захватывай первый мьютекс
int w = 0;
while((w<BUFSIZE) && (!feof(fd)))
{
buffer[w] = fgetc(fd);
w++;
}
if ((feof(fd)) && (w<BUFSIZE)) buffer[w] = '\0';
pthread_mutex_unlock(&my_sync); // Освобождаем мьютекс — здесь освобождай 2й мьютекс
usleep(x);
}
fclose(fd);
isexit = 1;
return;
}
 
void* read_thread (void* dummy) // Функция чтения
{
print("Обработка данных");
int s = 0;
int t = 0;
for (;;)
{
<--- здесь нужно ждать второй мьютекс
pthread_mutex_lock(&my_sync); // Захватываем мьютекс — здесь захватывай второй мьютекс
int i = 0;
int CountOfSpace = 0;
while((i<BUFSIZE) && (buffer[i]!= '\0'))
{ 
printf ("%c", buffer[i]);
if (buffer[i] == '\n')
{
CountOfSpace++;
}
i++;
}
s = s + CountOfSpace;
t = t + i;
pthread_mutex_unlock (&my_sync); // Освобождаем мьютекс — здесь освобождай 1й мьютекс
usleep(x);
if(isexit == 1)
break;
}
printf("Количество символов в файле:%d\n", t);
printf("Количество строк в файле:%d\n", s);
return;
}
Программа работает но не совсем так как надо.. то есть вывод результата постоянно разный. Но если я увеличу размер буфера то этой проблемы не будет возникать.. но мне надо сделать как можно меньше буфер.. Проблема с синхронизацией на мой взгляд.. Но разобраться так и не смог(((
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.06.2012, 08:22
Ответы с готовыми решениями:

Посчитать количество символов в текстовом документе с помощью потока
Помогите решить задачку) Надо написать программу, которая будет считать количество символов в текстовом документе.

Некорректное выполнение дополнительного потока
Добрый день! У меня такая проблема. В отдельном потоке запускаю нижепредставленный код, однако в процессе выполнения этого потока основной...

Взаимодействие дополнительного потока и формы
Собственно по ошибке начинал на Delphi. Делал многопоточные программы. Обращался к форме из потока методом Form1.Edit1.Text и засовывал...

4
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
06.06.2012, 08:21
Цитата Сообщение от Alexander26k Посмотреть сообщение
Но если я увеличу размер буфера то этой проблемы не будет возникать..
Вовсе не факт.

Цитата Сообщение от Alexander26k Посмотреть сообщение
Проблема с синхронизацией на мой взгляд..
Их 2:
1. Нет 100% гарантии, что на старте писатель захватит мьютекс первым.
2. нет гарантии, что писатель или читатель не отработает больше одного раза подряд (usleep() не серьезно).
Используйте condition variable.
1
0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 25
06.06.2012, 13:15  [ТС]
Спасибо я уже разобрался))).. А подскажите как сделать с одним мьютексом?!
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.06.2012, 07:40
Цитата Сообщение от Alexander26k Посмотреть сообщение
А подскажите как сделать с одним мьютексом?!
Добавить флаг, например 0 - буфер пуст, 1 - есть данные. Если значение флага не соответствует нужному нити и после изменения флага звать sched_yield().
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
09.06.2012, 13:51
Чтобы не было проблем с мьютексами, надо использовать сообщения и очереди
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.06.2012, 13:51
Помогаю со студенческими работами здесь

Нарисовать картинку в StatusBar из дополнительного потока
Гружу картинку в статус бар - images.Draw(statusbar.Canvas,X,Y,Number); Смысл такой, проверяю если ли соединение с интернетом - если...

Ошибка при создании дополнительного потока
Здравствуйте. Создаю доп. поток в программе unsigned __stdcall ThreadFunc( void* pArguments ) { unsigned Counter; while (...

Подсчет определенных символов из файла
Разработать программу, принимающую на входе (в качестве параметра) файл, написанный на языке высокого уровня. Во файле считается число...

Аварийное закрытие программы: ProgressBar с использованием дополнительного потока
В WPF набрал такой простенький пример с применением дополнительного потока: namespace TKControls { /// &lt;summary&gt; ///...

Обработка файла (поиск и замена) как единого потока символов
Есть, условно говоря, правила вида s/a\nc/ad\n/g s/\n\n\+/\n&lt;br&gt;\n/g Как провести замену в соответствии с этими правилами? sed и...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru