многопоточность — сбой реализации приоритета многопоточности c ++

знак равно

я здесь новый пользователь, и я новичок в c ++, поэтому мне немного сложно над этим работать …
так что я задаю вам, ребята, несколько вопросов! знак равно

я делаю работу для школы, которая просит меня реализовать приоритет потоков в это:

#include <pthread.h>
#include <stdio.h>
#include <sched.h>

int sched_yield(void);

// Parameters to print_function.

struct char_print_parms{
char character; // char to print
int count; // times to print
};

void* char_print (void* parameters){
int i;
struct char_print_parms* p;

p = (struct char_print_parms*) parameters;
for (i = 0; i < p->count; ++i){
fputc (p->character, stderr);
sched_yield();
}
return NULL;

}

int main (){

pthread_t thread1_id,thread2_id;
struct char_print_parms thread1_args,thread2_args;

// Create a new thread to print 200 x's.

thread1_args.character = 'x';
thread1_args.count = 200;
pthread_create (&thread1_id, NULL, &char_print, &thread1_args);

// Create a new thread to print 200 o's.

thread2_args.character = 'o';
thread2_args.count = 200;
pthread_create (&thread2_id, NULL,
&char_print, &thread2_args);

// main waits for the threads to complete

pthread_join(thread1_id, NULL);
pthread_join(thread2_id, NULL);

return 0;

}

Это дает «Oxoxoxo …» и т. Д.

Цель состоит в том, чтобы получить больше «о», пока не закончится.

То, что я сделал, было:

#include <pthread.h>
#include <stdio.h>
#include <sched.h>

int sched_yield(void);

// Parameters to print_function.

struct char_print_parms{
char character; // char to print
int count; // times to print
};

void* char_print (void* parameters){
int i;
struct char_print_parms* p;

p = (struct char_print_parms*) parameters;
for (i = 0; i < p->count; ++i){
fputc (p->character, stderr);
sched_yield();
}
return NULL;

}

int main (){

pthread_t thread1_id,thread2_id;
struct char_print_parms thread1_args,thread2_args;//new code lines
struct sched_param param;
pthread_attr_t pta;
pthread_attr_init(&pta);
pthread_attr_getschedparam(&pta, &param);
//end of new code lines

// Create a new thread to print 200 x's.

thread1_args.character = 'x';
thread1_args.count = 200;

//more new code lines
param.sched_priority = 0;
pthread_attr_setschedparam(&pta, &param);
pthread_setschedparam(thread1_id, SCHED_OTHER, &param);
//end of more new code lines

pthread_create (&thread1_id, NULL, &char_print, &thread1_args);// Create a new thread to print 200 o's.

thread2_args.character = 'o';
thread2_args.count = 200;

//more new code lines 2
param.sched_priority = 10;
pthread_attr_setschedparam(&pta, &param);
pthread_setschedparam(thread2_id, SCHED_OTHER, &param);
//end of more new code lines 2

pthread_create (&thread2_id, NULL,
&char_print, &thread2_args);

// main waits for the threads to complete

pthread_join(thread1_id, NULL);
pthread_join(thread2_id, NULL);

return 0;

}

В конце я компилирую и пытаюсь запустить, но появляется ошибка:

Сегментация не удалась (ядро сброшено)

Еще раз, я новичок в c ++, и мой английский не очень хорош, но я хочу попытаться понять, почему это не работает. Любая помощь приветствуется!

0

Решение

Когда вы звоните pthread_setschedparam переменные идентификатора потока еще не были инициализированы. Итак, вы пытаетесь изменить параметры в неопределенном потоке.

Самый простой способ изменить приоритет — это сделать это в потоке.


Что касается неинициализированных локальных переменных, их значения являются неопределенными до явной инициализации. Использование неинициализированных локальных переменных приводит к неопределенное поведение.

Если вы видите пример в pthread_setschedparam Вы видите это вызывается с pthread_self установить приоритет собственных потоков. Вы можете использовать это либо для добавления поля в структуре, которую вы передаете потоку, который содержит приоритет, либо для использования функции потока-оболочки, которая устанавливает приоритет и затем вызывает фактическую функцию потока.

0

Другие решения

Вы должны сначала позвонить pthread_create (&thread1_id, NULL, &char_print, &thread1_args); создать тему thread1_id, затем вы можете установить приоритет этого потока. Я изменяю код, и он отлично работает.

thread1_args.character = 'x';
thread1_args.count = 200;
pthread_create (&thread1_id, NULL, &char_print, &thread1_args);

//more new code lines
param.sched_priority = 0;
pthread_attr_setschedparam(&pta, &param);
pthread_setschedparam(thread1_id, SCHED_OTHER, &param);

// Create a new thread to print 200 o's.
thread2_args.character = 'o';
thread2_args.count = 200;
pthread_create (&thread2_id, NULL, &char_print, &thread2_args);

//more new code lines 2
param.sched_priority = 10;
pthread_attr_setschedparam(&pta, &param);
pthread_setschedparam(thread2_id, SCHED_OTHER, &param);

Вы можете прочитать эту ссылку:https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_MRG/2/html/Realtime_Reference_Guide/chap-Realtime_Reference_Guide-Priorities_and_policies.html.

Я тестирую этот код, но вывод каждый раз отличается.

0

По вопросам рекламы [email protected]