2016-11-30 5 views
0

В настоящее время я изучаю многопоточность в C. Для этого задания я должен сделать многопоточную игру Жизни Конуэя. Программа выполняет кучу параметров при выполнении. Вот все переменная она принимает перед выполнением:Я правильно использую структуры?

./gameoflife <width> <height> <seed> <p> <freq> <#worker_threads> 

Во всяком случае, для того, чтобы сделать его многопотоковый я решил разделить нагрузку по вертикали между #worker_threads. Поэтому каждый рабочий поток имеет собственную ширинуStart и widthEnd для работы.

Вот что мои структуры данных выглядит следующим образом:

typedef struct { 

    int width; 
    int height; 
    int ** board; 

    int freq; 
    int nbThreads; 

    int * escaped; 

} masterStruct; 

typedef struct { 

    int widthStart; 
    int widthEnd; 
    int threadID; 
    masterStruct * master; //this is supposed to be a pointer to the struct above. 

}paramStruct; 

Сейчас в моем «Threader» нить (которая отвечает за выяснение widthStart и widthEnd) принимает в masterStruct в качестве аргумента. Внутри я называю связку pthread_creates, к которой я буду кормить paramsStruct в качестве аргумента. Я хотел бы, чтобы все эти вновь созданные pthreads имели доступ к одному и тому же глобальному masterStruct. Так что в моем «Threader» нить, я объявил его как таковой:

paramStruct p[workers]; //create as many paramStruct as nbThreads 

for (int i = 0; i < workers; i++) { 

    *(p[i].master) = myStr; //give each thread 
... 

Мой вопрос: Является ли это правильный путь, чтобы обеспечить все Pthreads имеют доступ к одной и той же masterStruct?

Любая помощь очень ценится.

+0

Обратите внимание, что в C '* (p [i] .master)' равнозначно 'p [i] -> master'. – glauxosdever

+0

@glauxosdever Я получаю сообщение об ошибке «error: invalid type of '->'», когда я пытаюсь это сделать. – user100000

+1

Это потому, что они не эквивалентны. Ваше первоначальное использование в порядке. Если бы это было '(* p [i]), то мастер, затем изменивший значение на' p [i] -> master', имел бы смысл. Теперь это не так. – eran

ответ

1

Я считаю, что это неправильно. *(p[i].master) = myStr; копии myStr некоторым (и я думаю, недействительным) памяти. Может быть, вы хотите вот так: p[i].master = &myStr;.