Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 所有线程都有相同的全局变量吗?_C_Multithreading_Synchronization_Pthreads_Semaphore - Fatal编程技术网

C 所有线程都有相同的全局变量吗?

C 所有线程都有相同的全局变量吗?,c,multithreading,synchronization,pthreads,semaphore,C,Multithreading,Synchronization,Pthreads,Semaphore,我在尝试用sempaphore实现线程同步问题时遇到了一个一般性问题。我不想涉及太多(不相关的)细节,所以我将给出我认为对澄清我的问题很重要的代码 sem_t*mysema; 紫罗兰色计数器; 结构我的信息{ pthread_t; int-id; }; 无效*屏障(无效*参数){ 结构我的信息*a=arg; arg->id=thrid; 而(计数器>0){ 工作吗(&mysem[thrid]) sem_wait(&mysema[third]) 显示我的工作(arg); 计数器--; sem_po

我在尝试用sempaphore实现线程同步问题时遇到了一个一般性问题。我不想涉及太多(不相关的)细节,所以我将给出我认为对澄清我的问题很重要的代码

sem_t*mysema;
紫罗兰色计数器;
结构我的信息{
pthread_t;
int-id;
};
无效*屏障(无效*参数){
结构我的信息*a=arg;
arg->id=thrid;
而(计数器>0){
工作吗(&mysem[thrid])
sem_wait(&mysema[third])
显示我的工作(arg);
计数器--;
sem_post(&mysema[thrid+1])
}   
返回NULL;
}           
int main(int argc,char*argv[]){
int N=atoi(argv[1]);
mysema=mallon(N*(*mysema));
计数器=50;
/*信号量初始化*/

对于(i=0;i而言,这些是不同的问题:

是否[线程]都看到相同的变量-计数器?(它是一个全局变量,在main中初始化)

如果线程为零,则第一次使用“counter=49”,其他所有线程(线程1、2、…M-1)都看到了吗

第一个相当简单:是的。在文件范围内声明的对象,没有存储类说明符
\u Thread\u local
,它是一个单独的对象,其存储持续时间是整个程序运行的时间。无论该对象的标识符在什么范围内并且可见,它都会标识相同的对象,而不管哪个线程正在访问它

第二个问题的答案更为复杂。在多线程程序中,存在数据竞争的可能性,并且包含数据竞争的程序的行为是未定义的。volatile
限定符不能防止这些;相反,您需要对每个shar的所有访问进行适当的同步ed变量,读和写。这可以由信号量或更常见的互斥量提供,以及其他可能性

您的代码的
计数器的减量
可能得到了充分的保护,但我怀疑没有,因为线程使用不同的信号量。如果这允许多个不同的线程执行

        display_my_work(arg);
        counter--;
…同时,您有一个数据竞争。但是,即使您的保护足够,在
while
条件下读取
计数器
显然没有正确同步,您肯定有一个数据竞争

数据争用导致的未定义行为的一个常见表现是线程看不到彼此的更新,因此,程序的未定义行为不仅通常意味着线程1…M-1可能看不到线程0对
计数器的更新,而且还特别使此类故障的可能性相对较大

可能相关: