学习富国网免费收录优秀网站,为了共同发展免费收录需做上本站友情链接,雪球目录网的工作人员才会审核收录,不做链接提交一律不审核,为了避免浪费时间:收录必看!!!
  • 收录网站:127
  • 快审网站:10
  • 待审网站:102
  • 文章:29796
当前位置:主页 > 新闻快讯 > “Linux:线程同步的做法有那些?”

“Linux:线程同步的做法有那些?”

发布时间:2021-06-19 13:54:02 阅读次数:

今天我们来谈谈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,则线程将自动被阻止,并释放等待状态变化的互斥。 如果另一个线程更改了条件,它会向关联的条件变量发出信号,调用一个或多个等待它的线程,重新获得互斥并重新评估条件。 如果两个进程共享可读写的内存,则可以使用条件变量实现两个进程之间的线程同步。

“Linux:线程同步的做法有那些?”

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,本站的工作人员将予以删除。