DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 899|回复: 0
打印 上一主题 下一主题

[待整理] Linux多线程同步方法

[复制链接]
跳转到指定楼层
楼主
发表于 2014-10-10 08:38:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是线程的几种同步方式:

1、 互斥量。

通过使用pthread的互斥接口保护数据,确保同一时间只有一个线程访问数据。互斥量从本质上讲是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。如下例所示,就是互斥量对共享数据的操作:
#include <stdio.h>
#include <pthread.h>
int value = 5;//共享变量
pthread_mutex_t mutex;//互斥变量
void *mythread1();
void mainshow();
int main()
{
int retval;
pthread_t tid1;
retval = pthread_create(&tid1,NULL,mythread1,&value);//创建线程
if(retval != 0){printf(“Can not create mythread1n”);
mainshow();
retval = pthread_join(&tid1,NULL);//等待线程mythread1结束
if(retval != 0){printf(“Can not join with mythread.n”);
printf(“value = %dn”,value);
return 0;
}
void *mythread1()
{
int retval;
retval = pthread_mutex_lock(&mutex);//上锁
value = value + 1;//对共享变量的操作
printf("value = %dn",value);
retval = pthread_mutex_unlock(&mutex);//解锁
pthread_exit((void *)0);
}
void myshow()
{
int retval;
retval = pthread_mutex_lock(&mutex);//上锁
value = value + 1;//对共享变量的操作
printf(“value = %dn”,value);
pthread_mutex_unlock(&mutex);//解锁
}

2、信号量

该信号量是Posix提供的基于内存的信号量,它们由应用程序分配信号量的内存空间。如下例所示,就是信号量对共享数据的操作:
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
int value = 5;
sem_t sem1,sem2;
void mainshow();
void *mythread();
int main()
{
int retval;
pthread_t tid;
retval = sem_init(&sem1,0,0);
retval = sem_init(&sem2,0,1);
retval =pthread_create(&tid,NULL,mythread,NULL);
mainshow();
pthread_join(tid,NULL);
printf("value3 = %dn",value);
return 0;
}
void *mythread()
{
int retval;
retval = sem_wait(&sem1);
value = value + 1;
printf("value1 = %dn",value);
retval = sem_post(&sem2);
pthread_exit((void *) 0);
}
void mainshow()
{
int retval;
retval = sem_wait(&sem2);
value = value + 1;
printf("value2 = %dn",value);
retval = sem_post(&sem1);
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-12-1 07:02 , 耗时 0.081389 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表