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

Как заставить потоки работать одновременно?

12.06.2015, 00:42. Показов 1932. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Для ядра Linux 2.6.18 или новее написать модуль, который будет делать
следующее:
1. Сформировать в памяти двусвязный список определённого размера, содержащий случайные значения, которые следует получить из генератора случайных чисел, встроенного в ядро Linux.
2. Запустить два потока (threads).
2.1 Потоку №1: начиная с головы списка подсчитывать количество нулевых битов в значениях элементов и количество пройденных элементов, освобождать учтённый элемент сразу после учёта.
2.2 Потоку №2: начиная с хвоста списка подсчитывать количество единичных битов в значениях элементов и количество пройденных элементов, освобождать учтённый элемент сразу после учёта.
3. По окончании элементов списка вывести результаты подсчёта.
4. Обеспечить однократную обработку каждого элемента списка (каждый должен быть учтён, но только один раз, одним из потоков).
5. Желательно, чтобы в потоках работали не две разные функции, а одна, принимающая особенности работы через аргументы.

На данный момент есть следующее
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
#include <linux/module.h>
#include <linux/init.h>
#include <linux/random.h>
#include <linux/slab.h>
#include <linux/kthread.h>
#include <linux/list.h>
#include <linux/sched.h>
 
typedef struct Dlist {
    int value;
    struct list_head list;
} Dlist;
 
struct task_struct *thread1, *thread2;
 
const int N = 10000;
 
Dlist mylist;
 
int thread_func(bool f) {
    unsigned int count = 0;
    unsigned int i = 0;
    int tempvalue;
    
    struct list_head *pos, *q;
    Dlist *tempelem;
 
    if (f) {
        list_for_each_safe(pos, q, &mylist.list) {
            tempelem = list_entry(pos, Dlist, list);
            tempvalue = tempelem -> value;
            while (tempvalue != 0) {
                count += tempvalue & 1;
                tempvalue = tempvalue >> 1;
            }
            i++;
            list_del(pos);
            kfree(tempelem);
        }
        count = sizeof(int)*8*i - count;
        printk("Elements from head - %d, \"0\" bytes - %d\n",i,count);
        kthread_stop(thread1);
    } else {
        list_for_each_prev_safe(pos, q, &mylist.list) {
            tempelem = list_entry(pos, Dlist, list);
            tempvalue = tempelem -> value;
            while (tempvalue != 0) {
                count += tempvalue & 1;
                tempvalue = tempvalue >> 1;
            }
            i++;
            list_del(pos);
            kfree(tempelem);
        }
        printk("Elements from tail - %d, \"1\" bytes - %d\n",i,count);
        kthread_stop(thread2);
    }
    return 0;
}
 
static int __init test_init(void) {
    printk("Program started!\n");
    Dlist *elem;
    INIT_LIST_HEAD(&mylist.list);
 
    unsigned int i;
    for (i = 0; i < N; i++) {
        elem = (Dlist *)kmalloc(sizeof(Dlist), GFP_KERNEL);
        elem -> value = get_random_int() % 100;
        list_add(&(elem->list), &(mylist.list));
    }
    thread1 = kthread_run(&thread_func,true,"thread1");
    thread2 = kthread_run(&thread_func,false,"thread2");
    return 0;
}
 
static void __exit test_exit(void) {
    printk("Program finished!\n");
}
 
module_init(test_init);
module_exit(test_exit);
На выходе имею:
Jun 12 00:40:06 oceandrama-VirtualBox kernel: [ 308.525408] Program started!
Jun 12 00:40:06 oceandrama-VirtualBox kernel: [ 308.530465] Elements from head - 10000, "0" bytes - 288505
Jun 12 00:40:06 oceandrama-VirtualBox kernel: [ 308.534229] Elements from tail - 0, "1" bytes - 0
Jun 12 00:40:11 oceandrama-VirtualBox kernel: [ 312.755464] Program finished!
Вопрос: как заставить потоки работать одновременно? И ещё просьба указать на все возможные недочеты и моменты, которые можно улучшить. Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.06.2015, 00:42
Ответы с готовыми решениями:

Как заставить работать потоки одновременно
Привет,Я запускаю два потока пуля и самолет но они работают в таком порядке сначала пуля летит до конца формы,потом уже пролетает...

Как заставить работать 2 части программы одновременно?
Так, как программа линейная то все получается по порядку, а меня это не устраивает. Мне нужно чтобы 1 часть и 2 часть стартанули...

Как заставить работать одновременно два сетевых подключения
Добрый день! направьте пожалуйста по правильному пути, в ПК два сетевых адаптера: 1. В первую сетевую приходит Интернет от модема...

1
deleted
177 / 50 / 5
Регистрация: 29.03.2013
Сообщений: 365
12.06.2015, 16:30
list_for_each_prev_safe
я конечно понимаю, что в доках написано, что этот макрос используется для безопасного вызова list_del, но ты лучше загляни в его реализацию и ты поймешь, что тебе никто не обещал, что list_del можно будет безопасно использовать для одного листа с двух потоков единовременно, kfree в твоем случае тоже может выполниться дважды на одном чанке памяти

Цитата Сообщение от Kollapser Посмотреть сообщение
kthread_stop(thread1);
Цитата Сообщение от Kollapser Посмотреть сообщение
kthread_stop(thread2);
Вангую, что даже после выгрузки модуля в процессах должно висеть два потока в состоянии D (TASK_UNINTERRUPTIBBLE) вплоть до перезагрузки. Код ни разу не выполнит 58 строку этого листинга(

надо было использовать workqueue

Для подсчета единичных битов в беззнаковом типе в ядре есть специальная для этого функция. Которая сделает это наиболее оптимальным образом, а не как у тебя с 32 and и 31 shr. На x86 с SSE можно вообще все это дело за одну инструкцию посчитать - popcnt, чем собственно ядро и воспользуется
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.06.2015, 16:30
Помогаю со студенческими работами здесь

Как заставить работать на ноутбуке asus k42j микрофон и наушники одновременно?
Здравствуйте, вопрос в заключается в следующем на данном ноутбуке всего один разьём под наушники и микрофон. Вопрос в основном к тем у кого...

Как "заставить" работать две команды одновременно?
???

Не могу заставить два монитора работать одновременно
Всем привет! Такая проблема друзья: имеется монитор LG W2242, подключенный через HDMI, и второй монитор (старый, уже с плоским экраном,...

Лабиринт. Заставить 2 части приложения работать одновременно.
Привет. от нечего делать начал писать что-то типа лабиринта (игру, или типа того). есть две части: первая отвечает за передвижения врага...

Можно ли заставить Tomcat работать одновременно на 2-х портах
Мне нужно настроить Tomcat так , чтобы например на aaa.ru:80 - был один сайт, а на aaa.ru:8081 - другой - можно ли это сделать в tomcat,...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru