Доступ к глобальным переменным в pthreads в разных c-файлах - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть main.c с глобальной переменной с именем int countboards. В main () я запускаю pthread, который слушает ОДНО TCP-соединение и запускает его через (progserver.c). Значит, эта тема никогда не вернется. В main () я ввожу функцию rmmain(...), которая находится в rm.c (RM = Ressource Manager). В rm.c я читаю countboards, в progserver.c в pthread я пишу в эту переменную (оба доступны extern int countboards).

Так что проблема в том, что когда я пишу countboards в pthread и хочу получить доступ к этой переменной после того, как она была записана в rm.c, она все еще имеет старое значение (в данном случае 0 вместо пример 10). Почему?

main.c:

int countboards;

int main(int argc, char** argv) {
  countboards = 0;
  pthread_t thread;
  pthread_create(&thread, NULL, startProgramserver, NULL);

  rmmain();

  return 0;
}

rm.c:

extern int countboards;

int rmmain(vhbuser* vhbuserlist, int countvhbuser,
       userio* useriolist, int countios, int usertorm, int rmtosslserver, int sslservertorm) {
  while(1) {
    int n;
    n=read(usertorm,buf,bufc); // blocks until command comes from the user
    ...
    board* b = findAFreeBoard(boardlist, countboards, usagelist); // here countboards should be >0, but it isn't
    ...
  }
}

programserver.c:

extern int countboards;
void* startProgramserver(void*) {
  ...
  sock = tcp_listen();
  ...
  http_serve(ssl,s, sslpipes);
}

static int http_serve(SSL *ssl, int s, void* sslpipes) {
  ...
  countboards = countboards + countboardscommands;
  ...
  // here countboards has the new value
}

1 Ответ

3 голосов
/ 12 сентября 2011

Вы видите кэшированную копию в каждом потоке. Я бы посоветовал объявить это volatile int countboards, за исключением того, что это действительно не очень хороший способ идти о вещах.

Глобалы - своего рода зло. Вы бы лучше обслужили, передав указатель на каждый поток и синхронизировавшись с мьютексом.

Редактировать: Подробнее об этом, поскольку вчера вечером я спешил ...

http://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-programming/

Как KasigiYabu упоминает в комментариях ниже, создавая "контекстную" структуру, которая содержит всю информацию, которую вы хотите поделиться между потоками, и передавая ее в pthread_create, поскольку последний аргумент является звуком подход и то, что я делаю, а также в большинстве случаев.

...