Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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_Linux_Multithreading_Mutex - Fatal编程技术网

c中的多线程。互斥量

c中的多线程。互斥量,c,linux,multithreading,mutex,C,Linux,Multithreading,Mutex,我的代码执行以下操作:创建N个线程,每个线程将全局变量计数器递增M倍。我使用互斥锁是为了确保计数器的最终值是M*N 我想观察没有互斥锁的情况,获得计数器的不同值,以便正确评估互斥锁的工作。我注释掉了互斥体,但结果是一样的。我应该让他们随机睡一段时间吗?我该怎么处理 #include <stdio.h> #include <pthread.h> #define N 10 #define M 4 pthread_mutex_t mutex; int counter=0;

我的代码执行以下操作:创建N个线程,每个线程将全局变量计数器递增M倍。我使用互斥锁是为了确保计数器的最终值是M*N

我想观察没有互斥锁的情况,获得计数器的不同值,以便正确评估互斥锁的工作。我注释掉了互斥体,但结果是一样的。我应该让他们随机睡一段时间吗?我该怎么处理

#include <stdio.h>
#include <pthread.h>

#define N 10
#define M 4

pthread_mutex_t mutex;
int counter=0;

void *thread_routine(void *parameter)
{
    pthread_mutex_lock(&mutex);
    int i;
    for (i=0; i<M; i++)
        counter++;
    pthread_mutex_unlock(&mutex);
}

int main(void)
{
    pthread_t v[N];
    int i;

    pthread_mutex_init(&mutex,NULL);

    for (i=0; i<N; i++)
    {
        pthread_create(&v[i],NULL,thread_routine,NULL);
    }

    for (i=0; i<N; i++)
    {
        pthread_join(v[i],NULL);
    }

    printf("%d %d\n",counter,N*M);
    if (N*M==counter)
        printf("Success!\n");
    pthread_mutex_destroy(&mutex);

    return 0;
}
#包括
#包括
#定义n10
#定义M4
pthread_mutex_t mutex;
int计数器=0;
void*线程_例程(void*参数)
{
pthread_mutex_lock(&mutex);
int i;

对于(i=0;i我不知道您使用了什么编译器,但在本例中,g++将完全消除线程,并在编译时计算计数器的最终值。 为了防止这种优化,可以使计数器变量不稳定

volatile int counter=0;
由于这将告诉编译器,外部资源可以随时更改变量,因此强制编译器不要对该变量进行任何可能产生副作用的优化。由于外部资源可以更改值,最终值可能不是N*M的结果,因此计数器的值将在运行时计算. WhozCraig在评论中所说的也很可能适用于你的情况,但我认为他指的是M,而不是N

除了您最初的问题:当您阅读计数器时,一旦所有线程都被连接起来,就应该为每个线程提供自己的计数器,并在它们完成计算时对所有线程的计数器求和。这样,您就可以在不使用任何锁或原子操作的情况下计算最终值

编辑:

您的第一个互斥测试如下所示

#define N 10
#define M 10000000

pthread_mutex_t mutex;
volatile int counter=0;

void *thread_routine(void *parameter)
{
    pthread_mutex_lock(&mutex);
    int i;
    for (i=0; i<M; i++)
        counter++;
    pthread_mutex_unlock(&mutex);
}
#define N 10
#define M 10000000

pthread_mutex_t mutex;
volatile int counter=0;

void *thread_routine(void *parameter)
{
//  pthread_mutex_lock(&mutex);
    int i;
    for (i=0; i<M; i++)
        counter++;
//  pthread_mutex_unlock(&mutex);
}
#定义N 10
#定义M 10000000
pthread_mutex_t mutex;
易失性整数计数器=0;
void*线程_例程(void*参数)
{
pthread_mutex_lock(&mutex);
int i;

对于(i=0;i每个线程很可能在下一个线程启动之前完成。对
M
使用一个更大的数字,理想情况下,同步它们的启动。关闭优化器使您的预期代码实际运行已成定局。如果在多核机器上执行,也可能会出现问题。我在这里的4核机器M=40000,我每次得到“400000”。如果我只运行40个,那么数字总是匹配的,正如WhozCraig所建议的,很可能是因为线程启动时间具有“步进”的效果您的运行。我想我使用的是gcc。文件以.c扩展名保存,我在ubuntu 14.04中使用gcc命令进行编译。只需将m设置为1000万左右,并按照答案中的说明使计数器变量不稳定。这将为您的第一个互斥体测试获得所需的行为。对于第二个测试,另外删除pthread_mutex_lock(&mutex);和pthread_mutex_unlock(&mutex);在thread_例程中。然后您应该获得所需的竞争条件,结果将是一个随机数0