#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
typedef struct
{
volatile unsigned long count;
} atomic_t;
void atomic_inc(unsigned long *ptr)
{
__asm__("incl %0;\n"
: "+m"(*ptr));
}
static inline int atomic_xchg(atomic_t* v, int i)
{
int ret;
asm volatile(
"xchgl %0, %1"
:"=r"(ret)
:"m"(v->count),"0"(i)
);
return ret;
}
void mutex_lock(atomic_t* v)
{
while (1 == atomic_xchg(v, 1)) {
sched_yield(); //获取锁失败后,放弃CPU
}
}
static atomic_t atomic;
unsigned long counter = 0;
void mutex_unlock(atomic_t* v)
{
v->count = 0;
}
void *read_msg_server(void *p)
{
while(1)
{
mutex_lock(&atomic);
atomic_inc(&counter);
printf("%s line %d. counter %ld.\n", __func__, __LINE__, counter);
mutex_unlock(&atomic);
}
return NULL;
}
void *write_msg_server(void *p)
{
while(1)
{
mutex_lock(&atomic);
atomic_inc(&counter);
printf("%s line %d. counter %ld.\n", __func__, __LINE__, counter);
mutex_unlock(&atomic);
}
return NULL;
}
void *final_msg_server(void *p)
{
while(1)
{
mutex_lock(&atomic);
atomic_inc(&counter);
printf("%s line %d. counter %ld.\n", __func__, __LINE__, counter);
mutex_unlock(&atomic);
}
return NULL;
}
int main(void)
{
atomic.count = 0;
pthread_t pthread1;
pthread_t pthread2;
pthread_t pthread3;
int err = pthread_create(&pthread1, NULL, read_msg_server, NULL);
if(err != 0)
{
perror("create pthread failure.");
return -1;
}
err = pthread_create(&pthread2, NULL, write_msg_server, NULL);
if(err != 0)
{
perror("create pthread failure.");
return -1;
}
err = pthread_create(&pthread2, NULL, final_msg_server, NULL);
if(err != 0)
{
perror("create pthread failure.");
return -1;
}
pthread_join(pthread2, NULL);
pthread_join(pthread1, NULL);
pthread_join(pthread3, NULL);
return 0;
}
结束
版权声明:本文为tugouxp原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。