знак равно
я здесь новый пользователь, и я новичок в 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, ¶m);
//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, ¶m);
pthread_setschedparam(thread1_id, SCHED_OTHER, ¶m);
//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, ¶m);
pthread_setschedparam(thread2_id, SCHED_OTHER, ¶m);
//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 ++, и мой английский не очень хорош, но я хочу попытаться понять, почему это не работает. Любая помощь приветствуется!
Когда вы звоните pthread_setschedparam
переменные идентификатора потока еще не были инициализированы. Итак, вы пытаетесь изменить параметры в неопределенном потоке.
Самый простой способ изменить приоритет — это сделать это в потоке.
Что касается неинициализированных локальных переменных, их значения являются неопределенными до явной инициализации. Использование неинициализированных локальных переменных приводит к неопределенное поведение.
Если вы видите пример в pthread_setschedparam
Вы видите это вызывается с pthread_self
установить приоритет собственных потоков. Вы можете использовать это либо для добавления поля в структуре, которую вы передаете потоку, который содержит приоритет, либо для использования функции потока-оболочки, которая устанавливает приоритет и затем вызывает фактическую функцию потока.
Вы должны сначала позвонить 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, ¶m);
pthread_setschedparam(thread1_id, SCHED_OTHER, ¶m);
// 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, ¶m);
pthread_setschedparam(thread2_id, SCHED_OTHER, ¶m);
Вы можете прочитать эту ссылку: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.
Я тестирую этот код, но вывод каждый раз отличается.