多线程之线程同步实例
1、使用互斥量实现线程同步:
//使用互斥量实现线程同步
#includestdio.h
#includestdlib.h
#includeunistd.h
#includepthread.h
//定义指针数组作为共享资源
char*buf[5];
//记录数组的下标
intpos;
//定义互斥量
pthread_mutex_tmutex;
void*task(void*pv)
{
//使用互斥量进行加锁
pthread_mutex_lock(mutex);
//访问共享资源
buf[pos]=pv;
sleep(1);
pos++;
//使用互斥量进行解锁
pthread_mutex_unlock(mutex);
returnNULL;
}
intmain(void)
{
//初始化互斥量
pthread_mutex_init(mutex,NULL);
//启动子线程去访问共享资源
pthread_ttid;
pthread_create(tid,NULL,task,"hello");
pthread_ttid2;
pthread_create(tid2,NULL,task,"world");
//等待子线程结束
pthread_join(tid,NULL);
pthread_join(tid2,NULL);
//遍历共享资源中的数据
inti=0;
for(i=0;ipos;i++)
{
printf("%s",buf);
}
printf("\n");
//销毁互斥量
pthread_mutex_destroy(mutex);
return0;
}
2、使用信号量实现线程同步:
//使用信号量实现线程同步
#includestdio.h
#includestdlib.h
#includeunistd.h
#includepthread.h
#includesemaphore.h
//定义指针数组作为共享资源
char*buf[5];
//定义变量记录数组的下标
intpos;
//定义信号量
sem_tsem;
void*task(void*pv)
{
//获取信号量
sem_wait(sem);
//访问共享资源
buf[pos]=pv;
sleep(1);
pos++;
//释放信号量
sem_post(sem);
returnNULL;
}
intmain(void)
{
//初始化信号量
sem_init(sem,0,1/*初始值*/);
//启动子线程去访问共享资源
pthread_ttid;
pthread_create(tid,NULL,task,"hello");
pthread_ttid2;
pthread_create(tid2,NULL,task,"world");
//等待子线程结束
pthread_join(tid,NULL);
pthread_join(tid2,NULL);
//遍历共享资源中的数据
inti=0;
for(i=0;ipos;i++)
{
printf("%s",buf);
}
printf("\n");
//销毁信号量
sem_destroy(sem);
return0;
}
为了更好的感受线程间的同步的重要性,可以将线程函数中的互斥量和信号量注释掉进行测试,可以更好的掌握线程同步问题。
Coding13