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

Планирование потоков

06.03.2013, 23:24. Показов 2145. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание состоит в том, чтобы создать собственный планировщик потоков в линукс, используя приоритеты потоков. Причем использовать только 1 POSIX поток.
Что делают потоки не важно, пусть в цикле увеличивают одну переменную. но нужно их синхронизировать между собой.

Вопрос в том, как вообще реализовать параллельное выполнение потоков без использования pthread? Использовать как-то обработку событий? и переключать выполнение задачи на другую при появлении потока, выше по приоритету, чем выполняемый? подскажите просто основную идею, как это сделать и возможно некоторые инструменты, которыми нужно пользоваться.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.03.2013, 23:24
Ответы с готовыми решениями:

Когда происходит планирование потоков?
Когда происходит планирование потоков? Помогите с ответом на вопрос

Область видимости общей переменной для потоков + закрытие потоков
Есть два вопроса про потоки. Первый. Как можно сделать общую переменную для основного потока и моих ? struct ThreadInfo1 { int...

Создание и завершение процессов и потоков. Приоритеты выполнения потоков
Здравствуйте. Буду очень раз если поможете понять,что конкретно нужно сделать в вот этом задании,пока особого представления о...

9
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.03.2013, 09:24
Цитата Сообщение от MaxCh Посмотреть сообщение
Вопрос в том, как вообще реализовать параллельное выполнение потоков без использования pthread?
Если не обходить условие "только 1 POSIX поток" через например clone(), то настоящей параллельности не будет.
Цитата Сообщение от MaxCh Посмотреть сообщение
Использовать как-то обработку событий? и переключать выполнение задачи на другую при появлении потока, выше по приоритету, чем выполняемый?
Завести периодический таймер, при каждом срабатывании просматривать список/очередь потоков и выбирать подходящий.
Гуглить user space threads
0
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 5
07.03.2013, 10:20  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
через например clone()
Новые процессы тоже нельзя использовать.

Про userspace поищу информацию, может через него как раз можно сделать. Спасибо))
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.03.2013, 11:27
Цитата Сообщение от MaxCh Посмотреть сообщение
Новые процессы тоже нельзя использовать.
имелись ввиду не процессы, а ядерные нити, которые не POSIX. ну да не суть.
Цитата Сообщение от MaxCh Посмотреть сообщение
может через него как раз можно сделать.
Именно так и работали нити в ранних линуксах и *bsd.
0
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 5
07.03.2013, 14:35  [ТС]
Не очень понятно, как это осуществить.. Как самому сделать псевдопараллельное выполнение команд разных функций?
надо создать свое представление потока.. как можно разбить неизвестную мне функцию на отдельные команды?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.03.2013, 14:45
Не надо ничего разбивать.
Погуглите на ключевые слова которые Вам дали и посмотрите на внутреннее устройство подобных библиотек. Если отбросить всякие навороты оно примитивно. Все сводиться к сохранению и переключению контекстов (например через sigsetjmp()) по сигналу интервального таймера.
1
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 5
07.03.2013, 20:58  [ТС]
g_u_e_s_t, Точно) Новичок просто в этом.)) Про контексты слышал, но не использовал, сейчас попробую.)

Добавлено через 5 часов 28 минут
Посмотрел.. Контекст есть только у процесса? как запустить две функции 1 процесса псевдопараллельно? Нельзя же просто сказать функции стоп (причем не в самой функции), а потом после выполнения другой функцией пару-тройку команд, запустить первую?

Добавлено через 3 минуты
Нужно же не изнутри останавливать функцию, а из мейна к примеру. или из другой функции вообще.

Добавлено через 28 минут
Чтобы переключатся между функциями нужно использовать setjmp() и longjmp(), если я использую множество функций, то мне нужен массив переменных jmp_buf? чтобы хранить каждое состояние контекста в каждой функции... и как распараллелить выполнение функций (допустим их уже переключаем) и само переключение контекста?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
09.03.2013, 10:24
Цитата Сообщение от MaxCh Посмотреть сообщение
Нельзя же просто сказать функции стоп (причем не в самой функции), а потом после выполнения другой функцией пару-тройку команд, запустить первую?
Можно. Во 2м сообщении топика сказано как.
Цитата Сообщение от MaxCh Посмотреть сообщение
Чтобы переключатся между функциями нужно использовать setjmp() и longjmp(),
лучше сохранять и маску сигналов.
Цитата Сообщение от MaxCh Посмотреть сообщение
мне нужен массив переменных jmp_buf?
Можно и массив, но я бы посоветовал сделать структуру описывающую Вашу нить (куда среди прочего войдет и буфер для сохранения контекста) и строить список/очередь таких структур.
Цитата Сообщение от MaxCh Посмотреть сообщение
и как распараллелить выполнение функций (допустим их уже переключаем) и само переключение контекста?
Никак. Не будет тут никакой параллельности (у Вас же все будет жить в одной системной нити). Давайте еще раз на пальцах:
У Вас есть интервальный таймер, т.е. раз в N времени нормальное выполнение программы будет прерываться обработчиком сигнала этого таймера. Это и есть "ядро" Ваших нитей. return из обработчика сигнала вернет Вас в место выполнявшееся перед получением сигнала, а [sig]longjmp() передаст управление в точку где делали сохранение контекста. Вам нужно скомбинировать оба эти способа:
C
1
2
3
4
5
6
7
8
9
10
11
if (setjmp(current_thread->context) == 0) {
  // Сохранили контекст выполняемой в данной момент нити.
  ...
  current_thread = scheduler_select_next_thread();  // Выбрали какую-то нить для запуска.
  ...
  longjmp(current_thread->context, 1);                // Запустили ее.
} else {
  // В результате longjmp() строкой выше оказались тут.
  ...
  return;                                                         // Выходим из обработчика сигнала.
}
0
0 / 0 / 0
Регистрация: 06.03.2013
Сообщений: 5
10.03.2013, 21:39  [ТС]
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <setjmp.h>
#include <pthread.h>
#include <math.h>
 
#define TIME_RUN 10
 
int count_of_func=0;
int run_func=0;
jmp_buf crt;
jmp_buf *func;
 
int func1(int n)
{
  int i = 0;
 
  for (i = 0; i < 100000; ++i)
  {
      printf("%i - %i", n, i);
  }
 
  return (i);
}
 
 
 
void* func_thr ( void* arg)
{
        int new_func=setjmp(crt);
        switch (new_func)
        {
            case 1:
                setjmp(*(func+new_func-1));
                func1(1);
                count_of_func--;
                break;
            case 2:
                setjmp(*(func+new_func-1));
                func1(2);
                count_of_func--;
                break;
            default:
                break;
        }
    return NULL;
}
 
 
int creat_th (jmp_buf *func, int *prior, int numb_of_func, int priority)
{
    count_of_func++;
 
    if (count_of_func!=1)
    {
        func=realloc(func, sizeof(jmp_buf)*count_of_func);
 
        prior=realloc(prior, sizeof(int)*count_of_func);
    }
 
    *(prior+count_of_func-1)=priority;
 
    longjmp(crt, numb_of_func);
 
    usleep(400);
}
 
int main()
{
    int *prioritet=malloc(sizeof(int));
 
    func=malloc(sizeof(jmp_buf));
 
    pthread_t pth;
 
    pthread_create (&pth, NULL, func_thr,(void*)run_func);
 
    creat_th(func, prioritet, 1, 6);
    run_func=1;
 
    while (count_of_func!=0)
    {
        longjmp(*(func+run_func-1), 0);
 
        usleep(*(prioritet+run_func-1)*TIME_RUN);
 
        setjmp(*(func+run_func-1));
 
        run_func++;
 
        if (run_func==count_of_func)
        {
            run_func=1;
        }
 
    }
 
    free(prioritet);
    free(func);
 
    return 0;
}
Вот так(( не очень работает, ошибка 138 ... сигментации..не могу понять, почему.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
11.03.2013, 09:26
Цитата Сообщение от MaxCh Посмотреть сообщение
Вот так(( не очень работает, ошибка 138 ... сигментации..не могу понять, почему.
Чтоб сказать где именно падает нужно это запустить, а мне лень.
Да и не поможет Вам это, сама идея сделать longjmp() в уже мертвую нить мягко говоря ущербная.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.03.2013, 09:26
Помогаю со студенческими работами здесь

Замедление работы потоков если запущено несколько потоков
Есть отдельный поток который движет красным квадратом. Он каждую миллисекунду меняет положение квадрата на пиксель. Есть другой поток, он...

Разработать программу, генерирующую n потоков в пуле потоков CLR
Добрый вечер. Решил поделать старые лабораторные, которые мне уже давно нужно было сдавать, но встрял на одном задании: &quot;Разработать...

Синхронизация потоков на элементарном уровне (переключение потоков)
в общем разбираюсь с потоками, на сколько понял мне нужен lock Вот имеется просто пример public void RunAdd() ...

Синхронизация потоков: проблема гонки потоков
Есть проблема в синхронизации потоков, которую я не знаю, как решить. Точнее у меня получается типичная гонка потоков. Есть функция,...

Общение пхп потоков, есть ли область видимая для всех пхп потоков?
Добрый день форумчане. Суть вопроса такова - сайт работает с апи вк, как известно у вк есть ограничение: запросы к апи должны идти не...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru