Форум программистов, компьютерный форум, киберфорум
Наши страницы
С под Linux
Войти
Регистрация
Восстановить пароль
 
кэп13
0 / 0 / 0
Регистрация: 25.09.2018
Сообщений: 36
1

Не вызывается функция в pthread_create полученная из dlsym

11.03.2019, 22:11. Просмотров 274. Ответов 1

Передо мной поставлена следующая задача: Реализовать программу по склейки одного файла из множества мелких, количество
потоков в четыре раза меньше количества мелких файлов. Функция потоков находится в динамической библиотеке. Необходимо связать основную программу с динамической библиотекой поздним связыванием. Ниже прилагаются коды программ. Проблема состоит в том, что потоки создаются, но потоки не передаются в ту самую функцию из библиотеки. Код компилируется без ошибок. Думается мне, ошибка скрыта в строках c dlsum и pthread_create. В чем может быть проблема?

Код основной программы:
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
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <dirent.h>
#include <stdbool.h>
#include <time.h>
#include <math.h>
#include <dlfcn.h>
 
int N = 6;
pthread_mutex_t mutex;
int koll;
 
int main(void) {
 
    void *handle = dlopen("libD2.so", RTLD_LAZY);
    void *(*prod)(void *a) = dlsym(handle, "prod");
 
    clock_t timem; 
    pthread_attr_t attrs;
        pthread_mutex_init(&mutex,NULL);
 
        //инициализация атрибутов потока
        if(0!=pthread_attr_init(&attrs)) {
            printf("Невозможно проинициализировать атрибуты\n");
            return 0;
        };
 
        //установка атрибута "присоединенный"
        if(0!=pthread_attr_setdetachstate(&attrs, PTHREAD_CREATE_JOINABLE)) {
            printf("Ошибка установки атрибутов\n");
            return 0;
        }
 
    
 
    koll = (N/4);//подсчет необходимого количества потоков
    if ( (N%4) != 0) koll++;
    printf("При указанном количестве каталогов, в программе будет %d потока\n", koll);
 
    timem = clock();
    pthread_t *threads=(pthread_t *)malloc(koll * sizeof(pthread_t*));
    int *numbers = (int *)malloc(koll * sizeof(int));//создание массива номеров
    for(int i = 0; i<koll; i++) numbers[i]=i;//инициализация его номерами
    
 
 
    for(int i = 0; i<koll; i++) {//создание потоков
            if(0!=pthread_create(&threads[i], &attrs, prod, &numbers[i])){
                printf("Ошибка при создании потока");
                return 0;
            }
            
        } 
 
    //ожидание завершения порожденных потоков
        for(int i = 0; i<koll; i++) pthread_join(threads[i], NULL);
    timem = clock() - timem;
 
    printf("Работа завершена\n");
 
    free(numbers);
    free(threads);
 
    dlclose(handle);
 
    pthread_attr_destroy(&attrs);
 
    return(0);
}
Код библиотеки

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
#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#include <dirent.h>
#include <stdbool.h>
#include <time.h>
#include <math.h>
 
pthread_mutex_t mutex;
char msg[100];
int  N;
FILE *result = NULL; 
 
void *prod(void *a){
        
    int NumThis= *((int*)a);//номер текущего потока
 
    char name[10];
    FILE *file = NULL;
 
    for (int i=NumThis*4;(i<=NumThis*4+3)&&(i<N);i++) {
 
            printf("Поток №%d. Рассматривается %d файл\n",NumThis+1,i+1);
        
        name[0] = '\0';     
        sprintf(name, "%d.txt", i+1);
        name[strlen(name)] = '\0';
 
 
        if ((file = fopen(name, "r")) == NULL) {
            printf("Невозможно открыть %d файл!\n", i+1);
            return 0;
        }
        else {
            while(!feof(file)) {
                msg[0] = '\0';
                fgets(msg,100,file); 
                msg[strlen(msg)] = '\0';
                
                pthread_mutex_lock(&mutex);
 
                if ((result = fopen("result.txt", "a")) == NULL) {//открытие результирующего файла
                    printf("Невозможно открыть файл для записи\n");
                    return 0;
                }
 
                fputs(msg, result);
                fclose(result);
 
                pthread_mutex_unlock(&mutex);
            }
            fclose(file);
        }
    
        sleep(1);
        
    
        
    }
    //pthread_exit(NULL);
}
Заранее благодарю.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2019, 22:11
Ответы с готовыми решениями:

Не вызывается функция
Проблема заключается в следующем: при выполнении в WM_CREATE не выполняется рекурсивная функция...

Не вызывается функция
Здравствуйте, вот какая проблема. В этом методе p.repaint() не вызывается, все остальное работает. ...

Не вызывается функция
Когда код функции находился в главной функции, то выполнялся без нареканий(не считая выскакивания...

Не вызывается функция?
int main() { cout&lt;&lt;&quot;Let's go!\n\n\n&quot;; int Fill_array(); } int Fill_array(double...

Не вызывается функция
Пишу функцию, то есть написал уже... А вызвать не могу ее, компилятор ругается страшно :( ...

1
Void1509
4 / 4 / 0
Регистрация: 17.09.2018
Сообщений: 41
13.03.2019, 22:56 2
Доброго времени суток !
1) У вас не правильно объявлен указатель на функцию
Увас :void *(*prod)(void *a) = dlsym(handle, "prod");
Надо:void (*prod)(void *a) = dlsym(handle, "prod");
2)Проверьте не вернулся ли указатель NULL. Если функция не найдена - указатель будет равен NULL.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2019, 22:56

на вызывается функция в IE 9
Здравствуйте в IE 9 в функции не вызывается функция updateChatArea() тобиш &lt;script...

Не вызывается функция
Всем привет. Вот мой код https://jsfiddle.net/ueagLh0d/ Требуется удалить класс shake у инпута...

Не вызывается функция
Здравствуйте. Не понимаю почему, но код работает, а программа даже не заходит в функцию. В чем...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru