Простой вопрос о потоках и копировании переменных (без необходимости синхронизации) - PullRequest
0 голосов
/ 01 декабря 2010

Если я хочу передать char * в различные потоки через pthread_create () и хочу, чтобы они работали независимо, какой самый простой способ сделать это безопасно?1003 *

псевдокод:

func1() { // part of a loop
    Create var.. 
    func2(var); 
}

func2(char* var) { // spawn a thread
    pthread_create(.....,&func3,(void*)var);
}

func3(void* var) {
    work with the var // unstable behavior
} 

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

Ответы [ 2 ]

1 голос
/ 01 декабря 2010

Вы не показываете детали "Create var ..." вашей программы, но, как правильно ответил Кристофер Хант, если она не объявлена ​​как static, она исчезнет, ​​когда функция func1 () вернется.Но что еще хуже, вы сказали «нет необходимости в какой-либо передаче данных», и если вы создаете var один раз и обращаетесь к нему из нескольких потоков, у вас возникает «передача данных» независимо от того, хотите вы этого или нет (и координация этого параллельного доступаэто зависит от вас).

Если вы хотите, чтобы каждый поток действительно имел свою собственную копию, с которой он мог связываться, не мешая другим потокам, вы можете дублировать его перед каждым вызовом pthread_create ().Например, вы можете вызвать strdup (), чтобы выделить личную копию строки для нового потока и передать эту копию в pthread_create ().

0 голосов
/ 01 декабря 2010

Вы должны быть осторожны с областью применения.Если ваша переменная объявлена ​​в стеке, то она исчезнет, ​​как только завершится func1.Либо выделите переменную в куче, либо в качестве статического.

...