c中的多线程。互斥量
我的代码执行以下操作:创建N个线程,每个线程将全局变量计数器递增M倍。我使用互斥锁是为了确保计数器的最终值是M*N 我想观察没有互斥锁的情况,获得计数器的不同值,以便正确评估互斥锁的工作。我注释掉了互斥体,但结果是一样的。我应该让他们随机睡一段时间吗?我该怎么处理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;
#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