2014-04-22 2 views
0

=)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; 

} 

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

Segmentation failed (core dumped)

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

+0

Запустите 'gdb [yourprogram]' и нажмите 'r'. Затем он должен точно сказать, где и что пошло не так. Возможно, вам придется скомпилировать свою программу с помощью опции -g. См. [Gdb tutorial] (http://www.cs.cmu.edu/~gilpin/tutorial/). (Из сообщения об ошибке я пришел к выводу, что вы используете Unix с помощью gcc, если нет, то укажите, что вы используете.) – nwp

+0

@nwp Спасибо за вашу помощь! Я запускаю этот код на CodeBlocks, на Ubuntu! Он делает все, что работает =) Но если бы я не использовал CodeBlocks, я бы сделал что-то вроде ... Скомпилировать: gcc -c nchars.c Исполняемый файл: gcc -o nchars -lpthread nchars.o Обычно он использует то, что я вижу (по словам профессора .........) – user3559945

ответ

0

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

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

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

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

+0

спасибо вам за помощь Joachim! =) Полагаю, понял, что вы имели в виду. Поэтому я изменил порядок кода, поставив эту часть ниже создания потока. Но когда вы сказали: «Самый простой способ изменить приоритет - это сделать сам поток.», что заставило меня понять, что я понимаю 0 из этого ... lol – user3559945

+0

@ user3559945 Обновленный ответ с некоторыми подсказками. –

0

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

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

спасибо за ваше время и ваш ответ! =) Я пробовал, но результат срабатывает так же, как и раньше – user3559945

+0

@ user3559945 Я обновляю ответ – BlackMamba

+0

Благодарю вас, я испытал, но снова результаты всегда выглядят одинаково. Как вы думаете, я могу ошибаться? – user3559945

Смежные вопросы