“Linux:线程同步的做法有那些?”
今天我们来谈谈linux吧。 线程同步的方法是哪一种? 的复印件。 这里简单介绍一下linux。 线程同步的做法有哪些? 希望能帮到大家。
在linux上实现线程同步的三种方法:
一、互斥( mutex ) )
通过锁定机制实现线程之间的同步。
1、初始化锁定。 在linux上,线程的独占数据类型是pthread_mutex_t。 在采用之前,需要进行初始化。
静态分配: pthread _ mutex _ t mutex = pthread _ mutex _ initializer;
动态分配:整数表达式(整数表达式,常数表达式);
2、上锁。 对共享资源的访问需要锁定独占量。 如果独占量被锁定,则调用线程将被阻止,直到独占量被解除锁定。
int pthread _ mutex _ lock ( pthread _ mutex * mutex );
英特尔迅驰移动通信系统(英特尔移动通信系统);
3、解除锁定。 完成对共享资源的访问后,解除互斥量的锁定。
int pthread _ mutex _ unlock (三维多维数据集);
4、销毁锁。 锁定在招聘完成后,必须销毁以释放资源。
int pthread _ mutex _ destroy (三维多维数据集);
# #包括
# #包括
# #包括
# #包括
# #包含iostream
单一名称空间固态硬盘;
phread _ mutex _ t mutex = pthread _ mutex _初始化器;
int tmp;
声音网格(声音网格) )。
{
cout thread id is pthread_self ( )结束符;
phread _ mutex _ lock (多连锁;
tmp = 12;
诺伊斯TMP终端;
thread _ mutex _解锁( mutex );
返回空值;
}
int主( ) )
{
phread _ t身份证;
cout main thread id is pthread_self ( )结束符;
tmp = 3;
cout in main func tmp =主功能终端;
if (! phread _ create (标识、空值、三角形、空值) )
{
建立贸易协定! 电子邮件;
}
else
{
创建故障! 电子邮件;
}
ph读_连接(标识,空值);
thread _ mutex _ destroy (矩阵);
返回0;
}
//编译: g +-othreadtestthread.CPP-lpthread
复制代码
二、条件变量( cond )。
与互斥不同,条件变量用于等待,而不是锁定。 条件变量用于自动阻止线程,直到发生特定情况。 采用了一般的条件变量和互斥锁。 条件变量分为条件和变量两部分。 条件本身受到互斥量的保护。 线程在改变条件状态之前必须锁定互斥量。 根据条件变量的不同,可以在睡眠中等待某种条件的出现。 条件变量是利用线程之间共享的全局变量进行同步的机制,主要包括两种行为。 一个线程等待条件变量的条件成立后挂起。 另一个线程使条件成立(给出条件成立信号)。 的条件检测在互斥的保护下进行。 如果条件为false,则线程将自动被阻止,并释放等待状态变化的互斥。 如果另一个线程更改了条件,它会向关联的条件变量发出信号,调用一个或多个等待它的线程,重新获得互斥并重新评估条件。 如果两个进程共享可读写的内存,则可以使用条件变量实现两个进程之间的线程同步。
1、初始化条件变量。
静态状态初始化,pthread _ cond _ tcond = pthread _ cond _ initial ier;
动态初始化,整数代码(整数代码,整数代码);
2、等待条件成立。 解除锁定,块等待条件变量必须为真。 timewait ( ) )即使设定等待时间也不会变为signal,而是返回etimeout ) )锁定,保证线程wait只有一个) ) ) ) ) ) )。
int pthread _ cond _ wait (读_码*码,读_乘_乘*乘);
int pthread _ cond _ time wait ( pthread _ cond _ t * cond,pthread_mutex *mutex,常数时间*固定);
4、激活条件变量。 pthread_cond_signal,pthread_cond_broadcast (启用所有等待线程) ) ) ) )。
英特尔领先代码代码(代码代码);
int pthread _ cond _ broadcast (预读_码_ t *码); //取消阻止所有线程
5、清除条件变量。 没有线程等待。 否则,我将返回ebusy
int pthread _ cond _ destroy (预读_码_ t *码);
CPP视图平面副本
# #包括
# #包括
# #包括stdlib.h
# #包括unistd.h
pthread_mutex_t mutex;三元组;
pthread_cond_t cond (预读码);
声音处理程序(声音标签) )。
{
自由( Arg );
( void )多元素;
}
void *三叉树1 ( void *四叉树) ) )。
{
phread _ clean up _ push (处理程序,矩阵);
while(1) )。
{
printf (线程1 is运行\ n )
phread _ mutex _ lock (多连锁;
Pthread_cond_wait(cond,乘法);
printf ( thread 1应用程序编码\ n
thread _ mutex _解锁( mutex );
睡眠( 4;
}
ph读_清除_泵( 0;
}
void *网格2 ( void *网格) ) )。
{
while(1) )。
{
printf (线程2 is运行\ n
phread _ mutex _ lock (多连锁;
Pthread_cond_wait(cond,乘法);
printf ( thread 2应用程序加密\ n
thread _ mutex _解锁( mutex );
睡眠( 1;
}
}
int主( ) )
{
pthread_t thid1,thid2;
printf (联合可变强度! \n
thread _ mutex _ init (多个,空值);
ph读_连字(连字,空值);
thread _ create (三态1,空值,三态1,空值);
ph read _ create (三态2,空值,三态2,空值);
睡眠( 1;
o
{
phread _ cond _ signal (代码;
1;
sleep(20;
pthread_exit(0;
返回0;
}
复制代码
# #包括
# #包括
# #包括stdio.h
# #包括stdlib.h
静态读取_矩阵_矩阵=整数矩阵初始化器;
静态前导码=前导码_初始化器;
结构节点
{
整数;
结构节点* n _下一个;
} *头=空值;
staticvoidcleanup _ handler (音频*地址) )。
{
printf (克拉恩UPhandlerofsecondthread./ n
自由( Arg );
( void ) Pthread_mutex_unlock ) MTX;
}
静态语音*三足动物(语音*标记)
{
结构节点* p =空值;
清除_处理程序,p );
while(1) )。
{
//该mutex主要用于保证pthread_cond_wait的同时性
ph读取多路锁定( MTX;
while (头= =空值) )。
{
//该while必须特别证明各个pthread_cond_wait功能是完整的。 为什么
//这里需要while (头= =空)吗? pthread_cond_wait的线为
//程可能会突然醒来,但如果这个时候是head! = null不是我们想要的情况。
//此时,线程应该继续进入pthread_cond_wait
// pthread_cond_wait会先解除上一个pthread_mutex_lock锁定的mtx,然后按一下,
//然后等待成对休眠直到再次被唤醒()大多数情况下,等待条件成立
//被唤醒后,该过程先锁定Pthread_mutex_lock(MTX )。 重新装入资源
//在这个流程中比较清晰
ph读码等待(密码,mtx );
p =头;
头=头- n _下一个;
printf (千兆以太网/ n,P-n _编号);
自由( p;
}
pthread_mutex_unlock(MTX; //临界区域的数据操作完成,解除排他锁定
}
ph读_清除_泵( 0;
返回0;
}
int main (语音) )。
{
phread _ t标识符;
英特尔;
结构节点* p;
//子线程会像生产者和顾客一样继续等待资源,但这里的顾客可以是多个顾客,相反
//不仅支持普通的个别客户,而且这种模式很简单,但很强大
thread _ create (三角形、空值、三角形、空值);
睡眠( 1;
for(I=0; I + )
{
p = (结构节点* )宏观)结构节点);
p-n _编号= I;
ph读取多路锁定( MTX; 需要操作名为head的临界资源,必须先锁定,
p-n _下一个=头;
头= p;
phread _ cond _ signal (代码;
pthread_mutex_unlock(MTX; //解除锁定
睡眠( 1;
}
printf ( thread1wannaendtheline.socancelthread2./n
关于pthread_cancel,有从外部终止子线程,子线程在最近的取消点终止的附加证明
//线程,但在我们的代码中,最近的取消点一定是pthread_cond_wait ) )。
thread _ cancel (标识符;
连接( tid,空值);
printf (全部完成--- -完成/ n
返回0;
}
复制代码
三、信号量( sem )。
就像进程一样,线程也可以通过信号量实现通信。 虽然很轻。 信号函数的名称都以sem_开头。 线程采用的基本信号量函数有4个。
1、信号量的初始化。
intSEM_init(SEM_t*SEM,int pshared,无符号int值);
它初始化由sem指定的信号,设置其共享选项( linux仅支持0,表示它是当前进程的本地信号),然后给出初始值value。
2、等待信号量。 将信号量减1,等待信号量值大于0。
intSEM_wait(SEM_t*SEM );
3、释放信号量。 信号的大小加1。 通知其他等待线程。
int SEM _后期( SEM _ t * SEM );
4、放弃信号量。 我们用完信号量后再打扫。 归还占有的全部资源。
intSEM_destroy(SEM_t*SEM );
# #包括
# #包括
# #包括
# #包括
# #包括
# #包括
# #定义返回_ if _故障( p ) if ) ) p ) == 0) )打印机( % s :功能错误! /n,__func__ ); 返回; }
类型结构_优先级信息
{
sem_t s1;
sem_t s2;
时间结束时间;
( }飞利浦信息;
saticvoidinfo _ init (三级信息*三级);
staticvoidinfo _ destroy (三级信息*三级);
静态语音*频率_函数_1(优先级信息*频率);
静态语音*频率2 (优先级信息*频率);
int main (英特尔航空(英特尔航空* *航空) ) ) ) ) ) ) ) ) ) ) )。
{
pthread_t pt_1 = 0;
pthread_t pt_2 = 0;
int ret = 0;
priv信息* thiz =空值;
thiz = ( priv信息* ) malloc ) sizeof ) priv信息);
if ( thiz = =空值) ) ) )。
{
printf ( % s :故障辅助程序./n
返回- 1;
}
信息单位( thiz );
ret=Pthread_create(pt_1,空值,) void* ) pthread_func_1,thiz );
红外线! = 0)
{
错误( pthread _1_创建:
}
ret=Pthread_create(pt_2,空值,) void* ) pthread_func_2,thiz );
红外线! = 0)
{
错误( pthread _2_创建:
}
连接( pt _ 1,空值);
连接( pt _ 2,空值);
信息失真( thiz );
返回0;
}
staticvoidinfo _ init (四季度信息* ) )。
{
返回故障! =空值;
thiz -结束_时间=时间(空值) + 10;
SEM _ init ( thiz-s 1,0,1 );
SEM _ init ( thiz-s 2,0,0 );
返回;
}
staticvoidinfo _ destroy (优先信息* thiz ) )。
{
返回故障! =空值;
SEM_destroy(THIZ-
SEM_destroy(THIZ-
自由(缇z );
thiz =空值;
返回;
}
静态语音*频率_函数_1(优先级信息*频率) )。
{
返回故障! =空值;
while (时间(空值) thiz -结束_时间) ) ) ) ) ) ) ) ) )。
{
等待( thiz -
printf ( pthread1: pthread1getthelock./ n
SEM_post(THIZ-
printf ( pthread1: pthread 1解锁/ n
睡眠( 1;
}
返回;
}
静态语音*频率2 (优先级信息*频率) )。
{
返回故障! =空值;
while (时间(空值) thiz -结束_时间) ) ) ) ) ) ) ) ) )。
{
等待( thiz -
printf ( pthread2: pthread2gettheunlock./ n
SEM_post(THIZ-
printf ( pthread2: pthread 2解锁./n
睡眠( 1;
}
返回;
}
复制代码
linux :你相信线程同步的方法有那些吗? 这个文案对你有帮助,所以和好朋友分享的时候,欢迎感兴趣的朋友们一起讨论。
本文:《“Linux:线程同步的做法有那些?”》
免责声明:雪球目录网免费收录各个行业的优秀中文网站,提供网站分类目录检索与关键字搜索等服务,本篇文章是在网络上转载的,本站不为其真实性负责,只为传播网络信息为目的,非商业用途,如有异议请及时联系btr2031@163.com,本站的工作人员将予以删除。