Форум программистов, компьютерный форум, киберфорум
С под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
1

Создание потока, ошибка

07.04.2013, 11:14. Просмотров 1371. Ответов 10
Метки нет (Все метки)

Написал программу произведение элементов массива с помощью потока (по заданию требуется).
Проблема заключается в том, что флаг в функции clone считает как не объявленную переменную (что вроде не должен).
C
1
clone(potok,(void *)(tostack + NUMSTACK -1), CLONE_VM, (void *)(param +i));
C
1
clone(potok,(void *)(tostack + NUMSTACK - 1), CLONE_VM|CLONE_VFORK, (void *)(param + 3));
Флаг CLONE_VM и CLONE_VM|CLONE_VFORK.

Вот ошибки:
Код
gcc -Wall -o "lab4b" "lab4b.c" (в каталоге: /home/victor/Lab)
lab4b.c: В функции «main»:
lab4b.c:48:4: предупреждение: неявная декларация функции «clone» [-Wimplicit-function-declaration]
lab4b.c:48:49: ошибка: «CLONE_VM» undeclared (first use in this function)
lab4b.c:48:49: замечание: each undeclared identifier is reported only once for each function it appears in
lab4b.c:53:57: ошибка: «CLONE_VFORK» undeclared (first use in this function)
lab4b.c:54:2: предупреждение: format «%d» expects argument of type «int», but argument 2 has type «long int» [-Wformat]
Сборка завершилась с ошибкой.
Мне сказали, что надо изменить файл /etc/make.conf, в строке с CFLAGS дописать после знака = -O1, т.е. необходимо включить оптимизацию компилятора gcc. Но у меня нет такого файла по этому адресу.

Так что делать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2013, 11:14
Ответы с готовыми решениями:

Создание потока из потока.
Надо создать поток 1, в нем создать поток 2, сам я жуткий дураг, немаловероятно что правильного в...

Создание потока
Напишите программу, которая создает поток. Используйте атрибуты по умолчанию. Родительский и вновь...

Создание потока
Не могу понять как создать поток(( Напишите пример, в одном потоке чтобы было Label1->Caption=123;...

Создание потока
Ситуация такая: пишу игрушку - логическую, на шахматной доске (человек против компьютера)....

10
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.04.2013, 12:16 2
Цитата Сообщение от Mesken Посмотреть сообщение
еобходимо включить оптимизацию
Врут. -D_GNU_SOURCE если не поможет проверить что подключается sched.h
0
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
07.04.2013, 13:47  [ТС] 3
g_u_e_s_t, это надо вводит в терминале? если так то вот:
Код
victor@victor-VirtualBox:~/Lab$ gcc lab4b.c -D_GNU_SOURCE
lab4b.c: В функции «main»:
lab4b.c:48:4: предупреждение: в передаче аргумента 1 «clone»: несовместимый тип указателя [по умолчанию включена]
/usr/include/i386-linux-gnu/bits/sched.h:83:12: замечание: expected «int (*)(void *)» but argument is of type «int (*)(void *, int *, int)»
lab4b.c:53:2: предупреждение: в передаче аргумента 1 «clone»: несовместимый тип указателя [по умолчанию включена]
/usr/include/i386-linux-gnu/bits/sched.h:83:12: замечание: expected «int (*)(void *)» but argument is of type «int (*)(void *, int *, int)»
lab4b.c:54:2: предупреждение: format «%d» expects argument of type «int», but argument 2 has type «long int» [-Wformat]
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.04.2013, 13:55 4
да, можно в терминале. Теперь смотреть в man clone пока не станет понятна разница между написанным там и
Цитата Сообщение от Mesken Посмотреть сообщение
(void *)(tostack + NUMSTACK -1)
0
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
07.04.2013, 14:05  [ТС] 5
g_u_e_s_t, пишет
Код
victor@victor-VirtualBox:~/Lab$ man clone
Нет справочной страницы для clone
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.04.2013, 14:16 6
сочувствую.

Добавлено через 8 минут
На всякий случай если поставить/нагуглить маны не сможете (жирное - мое):
int clone(int (*fn)(void *), void *child_stack,
int flags, void *arg, ...
/* pid_t *ptid, struct user_desc *tls, pid_t *ctid */ );
А у Вас:
Цитата Сообщение от Mesken Посмотреть сообщение
int (*)(void *, int *, int)
0
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
07.04.2013, 15:22  [ТС] 7
g_u_e_s_t, и все равно не понимаю.

То что выделенное/жирное это стартовая функция? Так у меня это potok. Далее стэк, флаг и аргумент/параметр.

Слишком все запутано.

Добавлено через 10 минут
чего не хватает? у меня не прописан int? void? или еще что то?
Попроще, пожалуйста, объясните.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.04.2013, 15:35 8
На пальцах: хотят видеть int potok(void *arg) а не то что у вас.
0
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
07.04.2013, 15:48  [ТС] 9
а как это связано, то что флажки не воспринимает?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.04.2013, 15:50 10
никак.
0
0 / 0 / 1
Регистрация: 14.02.2011
Сообщений: 153
08.04.2013, 21:26  [ТС] 11
А что флажками? кто нибудь скажет, как заставить их работать?

П.С. не знаю имеет ли это значение, но работаю в ОС убунту.

Добавлено через 7 минут
и еще, на всякий случай код:
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
#include <alloca.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sched.h>
 
#define NUMSTACK 5000
unsigned int p = 1;
char stack[4][NUMSTACK];    //заменить NUMSTACK на число/кол-во
int *mas, n;
 
int potok(void *param)
{
    int i;
    int f = *(int *)param; 
    for (i = f; i < (n/4); i++)
        p *= mas[i];
    return 1 ;
}
 
int main()
{
    int *mas, i, n;
    int param[4];
    
    printf("\nУкажите размерность массива: ");
    scanf("%d", &n);
    
    mas = malloc(n*sizeof(int));
    srand(time(NULL));
    
    printf("Массив:\n");
    for (i = 0; i < n; i++)
    {
        mas[i] = rand()%10+1;
        printf("%d ", mas[i]);
    }
    
    if ((n/4) < 2)
        for(i = 0; i < n; i++)
            p *= mas[i];
    else 
        for (i = 0; i < 3; i++)
        {
            param[i] = i;
            char  *tostack = stack[i];
            clone(potok,(void *)(tostack + NUMSTACK -1), 0, (void *)(param +i));
        }
    param[3] = 3 ;
    char *tostack = stack[3];
    
    clone(potok,(void *)(tostack + NUMSTACK - 1), 0, (void *)(param + 3));
    printf("\nПроизведение = %d", p);
    
    return 0;
}
Программа в общем то не ругается, но не выполняется функция potok.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2013, 21:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Создание потока
Доброй всем ночи! Перерыскал cplusplus.com, но так и не разобрался. Может ли кто-нибудь...

Создание потока
В общем дело такое, есть функция main, само собой, и есть функция void music (), void music () {...

Создание нового потока
Вот тут выдаёт ошибку. DWORD thID; CreateThread(NULL,NULL,SexToClient, ...

Создание удаленного потока
Приветствую! Собственно имеется код, который создает поток, подгружающий DLL в чужой процесс: ...


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

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

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