Вопрос о pthreads и указателях - PullRequest
0 голосов
/ 21 сентября 2011

Вот пример кода создания потока, который часто можно увидеть. pthread_create использует много указателей / адресов, и мне было интересно, почему это так.

    pthread_t threads[NUM_THREADS];
    long t;
      for(t=0; t<NUM_THREADS; t++){
          rc = pthread_create(&threads[t], NULL, &someMethod, (void *)t);
      }

Есть ли главное преимущество или отличие в использовании '&' для ссылки на переменный массив 'threads', а также 'someMethod' (в отличие от просто 'threads' и просто 'someMethod')? А также, почему «t» обычно передается как пустой указатель, а не просто «t»?

1 Ответ

2 голосов
/ 21 сентября 2011
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
    void *(*start_routine)(void*), void *arg);

Вам необходимо передать pointer в pthread_t переменную pthread_create.&threads[t] и threads+t достигают этого.threads[t] нет.pthread_create требует указатель, чтобы он мог возвращать значение через него.

someMethod является подходящим выражением для третьего аргумента, так как это адрес функции.Я думаю, что &someMethod является избыточно эквивалентным, но я не уверен.

Вы используете t на void *, чтобы вставить long в void *.Я не думаю, что long гарантированно поместится в void *.Это определенно неоптимальное решение, даже если гарантия существует.Вы должны передать указатель на t (&t, приведение не требуется) для ясности и обеспечения совместимости с ожидаемым void *.Не забудьте настроить someMethod соответственно.


pthread_t threads[NUM_THREADS];
long t;
for (t=0; t<NUM_THREADS; t++) {
    rc = pthread_create(&threads[t], NULL, someMethod, &t);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...