2015-05-15 3 views
0

Я вижу различные способы запуска потоков в ubuntu и на другой платформе linux.Выполнение резьбы: как обеспечить систематический запуск нити

pthread_create (&thread1, NULL, (void *) &myfun1, (void *) msg1); 
pthread_create (&thread2, NULL, (void *) &myfun2, (void *) msg2); 
pthread_create (&thread3, NULL, (void *) &myfun3, (void *) msg3); 
pthread_create (&thread4, NULL, (void *) &myfun4, (void *) msg4); 

В приведенном выше случае убунту, сначала thread4 начинает в то время как в случае с другой операционной системы Linux это thread1. Когда я проверил причину, похоже, из-за политики планирования (исправьте меня, если я ошибаюсь).

  1. В этих случаях, чтобы гарантировать, что всегда первый поток (thread1) выполняется первым, несмотря на различные вкусы linux.

  2. /Общий запрос /, не зависит ли политика планирования от ядра? Потому что два разных типа выполнения потоков видны в разных вариантах linux.

+0

Он лежит в природе асинхронности о том, что является asynchon. Без дополнительной механики синхронизации (мьютексы/условия) вы не можете предсказать порядок выполнения потоков (или даже запуска). – alk

+0

ok synch мы можем добавить после начала потока. Но до создания потока как обеспечить? – BUGGY

+0

Вы должны предположить, что любой поток в любое время можно приостановить, чтобы дать время обработки другому потоку. Итак, если вам удалось запустить их в надежном порядке, это все равно ничего вам не даст. Я думаю, что все, что вы думаете, чего вы можете достичь, это иллюзия, и вы должны описать, какова ваша фактическая проблема. Кроме того, вы, кажется, нацелились на такой язык C-ish, но какой именно это? Пока вы на нем, добавьте «многопоточность» в список тегов. –

ответ

0

Псевдо код, который делает поток 1 старт перед другим потоком выполнения задачи:

Mutex mutex = ... /* static init here */ 
Condition cond = ... /* static init here */ 

boolean first_thread_running = false; 

thread1 
{ 
    mutex_lock 

    first_thread_running = true; 
    cond_signal 

    mutex_unlock 

    /* do things */ 
} 

thread<N> /* with <N> = {2, 3, 4} */ 
{ 
    mutex_lock 

    while (not first_thread_running) 
    cond_wait 

    mutex_unlock 

    /* thread1 definitly runs now */ 

    /* do things */ 
}  


main 
{ 
    /* The order of the following statements does not matter, thread 1 
    will always be started before the other threads "do their things". */ 

    thread4_create 
    thread2_create 
    thread1_create 
    thread3_create 

    ... 
+0

Ну, я ожидал, что может быть какой-то другой способ, кроме механизма блокировки, спасибо за предложение – BUGGY

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