1、并发线程同步与互斥
源程序:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
int num=30,count=10;
pthread_mutex_t mylock=PTHREAD_MUTEX_INITIALIZER;
void *sub1(void *arg) {
int i = 0,tmp;
for (; i <count; i++)
{
pthread_mutex_lock(&mylock); tmp=num-1;
usleep(13);
num=tmp; pthread_mutex_unlock(&mylock); printf("线程1 num减1后值为: %d\n",num);
}
return ((void *)0);
}
void *sub2(void *arg){
int i=0,tmp;
for(;i<count;i++)
{
pthread_mutex_lock(&mylock);
tmp=num-1;
usleep(31);
num=tmp;
pthread_mutex_unlock(&mylock);
printf("线程2 num减1后值为: %d\n",num);
}
return ((void *)0);
}
int main(int argc, char** argv) {
pthread_t tid1,tid2;
int err,i=0,tmp;
void *tret;
err=pthread_create(&tid1,NULL,sub1,NULL);
if(err!=0)
{
printf("pthread_create error:%s\n",strerror(err));
exit(-1);
}
err=pthread_create(&tid2,NULL,sub2,NULL);
if(err!=0)
{
printf("pthread_create error:%s\n",strerror(err));
exit(-1);
}
for(;i<count;i++)
{
pthread_mutex_lock(&mylock); tmp=num-1;
usleep(5);
num=tmp;
pthread_mutex_unlock(&mylock);
printf("main num减1后值为: %d\n",num);
}
printf("两个线程运行结束\n");
err=pthread_join(tid1,&tret);
if(err!=0)
{
printf("can not join with thread1:%s\n",strerror(err));
exit(-1);
}
printf("thread 1 exit code %d\n",(int)tret);
err=pthread_join(tid2,&tret);
if(err!=0)
{
printf("can not join with thread1:%s\n",strerror(err));
exit(-1);
}
printf("thread 2 exit code %d\n",(int)tret);
return 0;
}
编译链接命令:gcc threadmutex.c -o threadmutex -lpthread
运行命令:./threadmutex