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

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

05.06.2012, 08:22. Показов 1366. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru