LINUX.ORG.RU

Помогите разобраться с многопоточностью

 ,


0

1

Никогда не связывался с многопоточностью на чистом Си, но тут заставили. Функция, которая создает нити

int create_threads(){
    pthread_t thread1, thread2;
    int id1=1;

    int result;
    result = pthread_create(&thread1, NULL, ms_thread, &id1);
    if(result){
        printf("Couldn't create first thread\n");
        return -1;
    }
    int id2=2;
    result = pthread_create(&thread2, NULL, ms_thread, &id2);
    if(result){
        printf("Couldn't create second thread\n");
        return -1;
    }
    return 0;
}
Так выглядит начало ms_thread
void* ms_thread(void *arg){
    int thread_id=*(int *)arg;
    printf("Thread %d ready to serve!\n",thread_id);
Так вот, в одном из созданных потоков thread_id равно 1. А вот в другом потоке thread_id равно 0. Откуда взялся 0, когда должна быть 2?

★★★

Ответ на: комментарий от LIKAN

Или malloc, или глобально, или static. но никак не на стеке.

Dead ★★★★ ()
Последнее исправление: Dead (всего исправлений: 1)
Ответ на: комментарий от LIKAN

конечно, в приличном обществе так не делают, но int`ы можно и так перепихнуть :)

pthread_create(&thread1, NULL, ms_thread, (void *)id1);
...
void* ms_thread(void *arg){
    int thread_id=(int)arg;
    printf("Thread %d ready to serve!\n",thread_id);
а так либо malloc, либо static, либо синхронизоваться

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

Тогда уж pthread_create(&thread1, NULL, ms_thread, (int[]){1});.

d ★★★★ ()
Ответ на: комментарий от MKuznetsov

(void *)id1

(void *)(size_t)id1, чтобы не ругалось в 64-битном билде.

i-rinat ★★★★★ ()

Думаю, проще вот такую штуку заюзать из ms_thread (конкретно для такой задачи)

pthread_t pthread_self()

DarkAmateur ★★★ ()
Последнее исправление: DarkAmateur (всего исправлений: 2)
Ответ на: комментарий от mix_mix

Не забанили. Я там заново квест прохожу (эти сволочи мне обнулили "карму", когда до -100 всего 3 очка оставалось, сейчас -45, из которых -40 я набрал тупо лупанув правду-матку: что быдлокодеры тормозилы — рукожопые ослы).

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от teamfighter

О, кстати, я ж там тоже зарегистрирован. И все никак 1000 не наберу ни по одному аккаунту (из максимума: 814 по теху, 532 на SO и 488 на L&U).

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

-40 я набрал тупо лупанув правду-матку

Вся суть хабра на самом деле: кармадрочерство + стадный инстинкт.

mix_mix ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.