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

Переделать задачу с потоками на fork

19.05.2012, 15:31. Показов 1442. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно скопировать файл, использую параллельное программирование. Есть реализация этой задачи с использованием потоков(pthread), нужно реализовать с использованием сигналов и очереди сообщений.
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
102
103
104
105
106
107
108
#include <stdio.h>
#include <sys/time.h>
#include <pthread.h>
 
const int kilobyte=1024;//in bytes(1024 byte = 1 kilobyte)
int bufsize=0;//in kilobytes
FILE * f=NULL;
FILE * df=NULL;
 
void * processing(void *);
int par(void);
void initbufsize(void);
//мьютекс
pthread_mutex_t mutex;
 
int main(int argc,char* argv[])
{
    initbufsize();
    par();
 
    return 0;
}
 
void * processing(void * x)
{
    int number=*((int*)x);  
    
        pthread_mutex_lock(&mutex);
        unsigned char byte='0';
        printf("%d-й блок...\n",number+1);
        int j=0;//смещение в пределах bufsize
        int flag=0; 
        fseek(df,number*bufsize+j,SEEK_SET);        
        while((feof(df)==0)&&(j<bufsize)&&(flag==0)){
            fseek(df,number*bufsize+j,SEEK_SET);        
            if(fread(&byte,sizeof(byte),1,df)==1){
                fseek(f,number*bufsize+j,SEEK_SET);
                if(fwrite(&byte,sizeof(byte),1,f)!=1){
                    puts("Error thread!");
                    flag=1;
                }
            }
            j++;
        };
        pthread_mutex_unlock(&mutex);
    
    return 0;
}
 
int par()
{
    puts("Параллельное программирование");
 
    unsigned char byte='0';
    df=fopen("data.jpg","rb");
    fseek(df,0,SEEK_END);
    long int size=ftell(df);
    printf("Размер исходного файла: %lu байт\n",size);
    int numbloks=size/bufsize+1;
    printf("Блоков для копирования: %d, размер блока: %d байт\n",numbloks,bufsize);
 
    //numbloks объектов типа "описатель потока"
    pthread_t potok[numbloks];
    int bloks[numbloks],i;
    for(i=0;i<numbloks;i++) bloks[i]=i;
    
        pthread_mutex_init(&mutex,NULL);
 
    struct timeval tv1, tv2; 
    struct timezone tz1, tz2; 
    gettimeofday(&tv1, &tz1); 
    
    df=fopen("data.jpg","rb");
    f=fopen("PARresult.jpg","wb");
    
    for(i=0;i<numbloks;i++){
        if(0 != pthread_create(&potok[i], NULL, processing, &bloks[i]))
            {
                printf("Не могу создать поток для %d-го блока!\n",i);
                return 0;
            }
    }
    
    //ожидание завершения порожденных потоков
    for(i=0; i<numbloks; i++)
        if(0!=pthread_join(potok[i], NULL))
        {
            puts("Не могу подключиться к потоку!");
            return 0;
        }
 
    gettimeofday(&tv2, &tz2); 
    int diff = (tv2.tv_sec - tv1.tv_sec)*1000000 + (tv2.tv_usec - tv1.tv_usec); 
    printf ("Время выполнения программы: %d милисекунд\n", diff);
 
    fclose(df);
    fclose(f);
    
    pthread_mutex_destroy(&mutex);
    
    return 0;
}
 
void initbufsize(void)
{
    bufsize=32*(int)kilobyte;
    return;
}
Добавлено через 1 минуту
Файл копируется блоками по 32кб за 1 поток.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.05.2012, 15:31
Ответы с готовыми решениями:

Распараллелить задачу, ипользуя при системный вызов fork (), и трубу pipe
Дали задание распараллелить какую то задачу, ипользуя при этом системный вызов fork(), и трубу pipe. К примеру, что б потомке считалась...

надо переделать задачу она уже решена ну ее нужно переделать
вот задача const n=4; var a:array of integer; i,s:integer; begin for i:=1 to n do begin write('Введите ',i,'-й элемент...

не компилируется fork: Undefined reference to fork
написал маленькую fork-бомбу #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int main() { while(1) { fork(); printf(&quot;HELLO...

3
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
20.05.2012, 14:05
Цитата Сообщение от nicklifs Посмотреть сообщение
Есть реализация этой задачи с использованием потоков(pthread), нужно реализовать с использованием сигналов и очереди сообщений.
Если нужен аналог показанной Вами реализации (у Вас нити работают строго по очереди), то например ставите обработчик SIGCHLD, в цикле форкаетесь, в ребенке копируете блок и выходите, а в родителе ждете когда прилетит сигнал.
0
4 / 3 / 4
Регистрация: 06.12.2011
Сообщений: 63
20.05.2012, 18:54  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Если нужен аналог показанной Вами реализации (у Вас нити работают строго по очереди), то например ставите обработчик SIGCHLD, в цикле форкаетесь, в ребенке копируете блок и выходите, а в родителе ждете когда прилетит сигнал.
А можно по подробней?
Я могу обойтись использованием только сигналов?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
20.05.2012, 19:29
Цитата Сообщение от nicklifs Посмотреть сообщение
А можно по подробней?
В Вашем коде вся работа обернута мьютексом т.е. на самом деле ни какой параллельности попросту нет (к слову, тот же самый эффект Вы могли бы получить внеся pthread_join() в цикл pthread_create())
Если Вы считаете это нормальным, то man fork (будет аналогом pthread_create()) и wait (pthread_join).
Цитата Сообщение от nicklifs Посмотреть сообщение
Я могу обойтись использованием только сигналов?
Не понимаю вопрос.
На самом деле, при таком подходе никакие сигналы Вам не нужны и SIGCHLD я приплел только потому, что Вы зачем-то просили сигналы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.05.2012, 19:29
Помогаю со студенческими работами здесь

Переделать задачу с do while в for
#include &lt;iostream&gt; using namespace std; int main() { setlocale(LC_ALL, &quot;RUS&quot;); int i, n, h; double s,...

переделать задачу
В заданном тексте определить слово с наибольшим вхождением заданного символа. помогите переделать строчку tt = array of string; так...

Переделать задачу
uses crt; const n=20; var m,v:array of real; i:byte; mx:real; begin randomize; for i:=1 to n do begin ...

Переделать задачу
Привет еще раз!)) У меня есть скелет кода, помогите переделать его для другой задачи! Вот задача: Оценки студентов. Записать в...

Как переделать задачу?
Y = 0, если n=1,2,3,4 1, если n=10,11,12 2, если n=15,19 3, в другом случае ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru