0 / 0 / 0
Регистрация: 21.03.2012
Сообщений: 25

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

05.06.2012, 08:22. Показов 1364. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
[В процессе разработки] SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru