Не можете pthreads получить доступ к переменным из функции main ()? - PullRequest
0 голосов
/ 26 ноября 2010
int main()
{
   int i; 
   pthread_t t; 
}

Неужели я не вижу?t создается внутри main, верно?Это означает, что он должен использовать ту же разделяемую память, которую использует main ()?Как мне сделать так, чтобы я видел, не делая ia глобальной переменной?

Ответы [ 2 ]

5 голосов
/ 26 ноября 2010

Что?t - это нить, она ничего не "видит".Строго говоря, это переменная, которая представляет поток - вы на самом деле не создали поток - но если вы его создадите, он выполняется в том же процессе, что и main(), поэтому он разделяет пространство памяти в этом смысле, ноне разделяет сферу действия основного. функции , которые выполняются в этом потоке, могут видеть любые переменные, находящиеся в области действия этих функций.

Вы можете передать указатель на i как указатель пользовательских данных на pthread_create.Или, если вам нужно получить доступ не только к i, вы можете передать указатель на некоторую структуру, которая содержит (помимо прочего) указатель на i и т. Д.

Пример кода:

#include <pthread.h>
#include <iostream>
#include <cstring>

void *thread_entry_point(void *data) {
    int *idata = static_cast<int*>(data);
    std::cout << "thread: i = " << *idata << "\n";
    *idata = 23;
    return const_cast<char*>("might as well return something");
}

int main() {
    int i = 12;
    pthread_t thr;

    int err = pthread_create(&thr, 0, thread_entry_point, &i);
    if (err == 0) {
        void *result;
        pthread_join(thr, &result);

        std::cout << "main: result = " << static_cast<const char*>(result) << "\n";
        std::cout << "main: i = " << i << "\n";
    } else {
        std::cout << "error creating thread: " << err << " " << std::strerror(err) << "\n";
    }
}
3 голосов
/ 26 ноября 2010

pthreads не являются особенными.Например, следующий код имеет ту же «проблему»:

void foo()
{
  i = 5;
}
int main()
{
   int i; 
   foo();
}

Конечно, foo вызывается main, поэтому они даже в одном потоке.Тем не менее, foo не видит int в main.Решение простое: если foo нужен int, main должен передать следующее:

void foo(int& i)
{
  i = 5;
}
int main()
{
   int i; 
   foo(i);
}

С потоками ситуация такая же: передайте то, что вам нужно, чтобы поделиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...