如何避免在线程中使用全局变量

我编写了一个C程序,它使用两个线程进行读写。 我已经将两个线程都访问的变量声明为Global。 在这种情况下如何避免使用全局变量。

在这种情况下,请避免使用全局变量。

没有必要避免全局变量。 您必须考虑的是某些锁定机制的有效数据。

将所有全局变量放入结构中是为了在项目增长时提供可读性和代码控制。

我建议你使用互斥锁..这是一个修改过的示例代码。

#include  #include  #include  typedef struct { double *a; double *b; double sum; int veclen; } DOTDATA; /* Define globally accessible variables and a mutex */ #define NUMTHRDS 4 #define VECLEN 100 DOTDATA dotstr; pthread_t callThd[NUMTHRDS]; pthread_mutex_t mutexsum; void *dotprod(void *arg) { /* Define and use local variables for convenience */ int i, start, end, len ; long offset; double mysum, *x, *y; offset = (long)arg; len = dotstr.veclen; start = offset*len; end = start + len; x = dotstr.a; y = dotstr.b; /* Perform the dot product and assign result to the appropriate variable in the structure. */ mysum = 0; for (i=start; i 

请在C中查看pthread库的以下方法,以便在C中独占访问共享全局变量:

 int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr); int pthread_mutex_lock(pthread_mutex_t *mutex); int pthread_mutex_unlock(pthread_mutex_t *mutex); int pthread_mutex_destroy(pthread_mutex_t *mutex); 

类似地,您可以查看信号量以同步C线程中全局变量的使用。

你真的需要一个共享变量,或者你真的需要每个线程2个相同数据的副本吗? 如果是这样,不是将其声明为全局,而是在创建时将其作为参数传递给线程。

如果确实需要共享,则需要使用互斥锁进行保护。 如果将共享变量与互斥锁一起捆绑到结构中,并在创建时将其作为参数传递给线程,您仍然可以取消全局变量。

我想你是问如何通过在启动期间传递他们的工作数据来避免让你的线程访问全局变量。

请参阅pthread_create的最后一个参数,它允许您定义用户定义的自定义指针,它可以是您想要的任何内容。 使用它来传递数据(例如结构地址甚至是按值,只要该值可以适合平台的void指针大小。

例如,父级可以通过这样做发送子线程数据:

 Data data; pthread_create(&thrd, NULL, threadProc, &data); 

子proc将通过以下方式引用:

 void *threadProc(void *pv) { Data *pData = (Data*)pv; .. use data here... pthread_exit(NULL); } 

我希望这是有道理的,希望它能帮助你理解如何将数据传递给线程proc,这就是我认为你的问题。

  1. 如果希望每个线程都有一个单独的变量副本,请将变量声明为线程局部。

你可以制作结构。 我通常使用一个名为globalArgs的结构,其中我将全部变量放在那里。

像这样的东西:

 static typedef struct { int foo; int baa; } globalargs; 

或者,您可以将所有值作为参数传递给需要的函数。