- 论坛徽章:
- 0
|
我现在有一个需求,多线程并发循环执行一个操作,但是要求精确计数操作了多少次
由于i++操作不是原子操作,所以,从kernel中扣了一段代码,试图进行计数
多次试验后发现,该段代码仍然不是原子操作
atomic自增操作定义如下 (该定义不完整,修改后可以工作的代码在二楼)
#ifndef ATOMIC_32
#define ATOMIC_32
typedef struct {
volatile int counter;
} atomic_t;
static inline void atomic_inc(atomic_t *v)
{
asm volatile( "incl %0"
: "+m" (v->counter));
}
#endif //ATOMIC_32
|
测试代码如下
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <getopt.h>
#include <pthread.h>
#include "atomic.h"
int thread_num=100;
typedef struct _Count
{
unsigned int m;
unsigned int n;
} Count;
typedef struct _Thread
{
pthread_t thread_id;
Count count;
} Thread;
Thread* thread;
int atomic_start( Count* count);
atomic_t x={0};
int main(int argc, char** argv)
{
thread=(Thread*)malloc(thread_num*sizeof(Thread));
memset(thread,0,thread_num*sizeof(Thread));
int i;
for(i=0;i<thread_num;i++)
{
if(pthread_create(&((thread+i)->thread_id),NULL, atomic_start,&((thread+i)->count)))
{
printf("thread create faild: %d",i--);
}
}
int count=0;
for(i=0;i<10;i++)
{
printf("%d\n",x);
sleep(1);
}
return 0;
}
int atomic_start( Count* count)
{
pthread_t thread_id=pthread_self();
pthread_detach(thread_id);
int i;
for(i=1000;i>0;i--)
{
atomic_inc(&x);
}
}
|
[ 本帖最后由 net_robber 于 2009-9-24 22:42 编辑 ] |
|