while 如何解决虚假唤醒 及 if 为什么就不行?

int in = 0, out = 0;

int items = 0, spaces = 10;

bool flag; // 标记线程结束运行

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t notfull = PTHREAD_COND_INITIALIZER; // 缓冲区不满

pthread_cond_t notempty = PTHREAD_COND_INITIALIZER; // 缓冲区不空

void *producer( void *arg ) {

while( flag ) {

pthread_mutex_lock( &mutex ); // 为保证条件变量不会因为多线程混乱,所以先加锁

while( !spaces ) { // 避免“惊群”效应,避免因其他线程实现得到事件而导致该线程“假醒”

pthread_cond_wait( &notfull, &mutex );

}

buf[in] = current++;

in = ( in + 1 ) % 10;

items++;

spaces–;

printf( “producer %zu , current = %d\n”, pthread_self(), current );

for( int i = 0; i < 10; i++ ) {

printf( “%-4d”, buf[i] );

}

printf( “\n\n” );

pthread_cond_signal( &notempty );

pthread_mutex_unlock( &mutex );

}

pthread_exit( NULL );

}

void *consumer( void *arg ) {

while( flag ) {

pthread_mutex_lock( &mutex );

while( !items ) {

pthread_cond_wait( &notempty, &mutex );

}

buf[out] = -1;

out = ( out + 1 ) % 10;

current–;

items–;

spaces++;

printf( “consumer %zu , current = %d\n”, pthread_self(), current );

for( int i = 0; i < 10; i++ ) {

printf( “%-4d”, buf[i] );

}

printf( “\n\n” );

pthread_cond_signal( &notfull );

pthread_mutex_unlock( &mutex );

}

pthread_exit( NULL );

}

int main() {

memset( buf, -1, sizeof(buf) );

flag = true;

pthread_t pro[10], con[10];

int i = 0;

for( int i = 0; i < 10; i++ ) {

pthread_create( &pro[i], NULL, producer, NULL );

pthread_create( &con[i], NULL, consumer, NULL );

}

sleep(1); // 让线程运行一秒

flag = false;

for( int i = 0; i < 10; i++ ) {

pthread_join( pro[i], NULL );

pthread_join( con[i], NULL );

先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

Docker步步实践

目录文档:

①Docker简介

②基本概念

③安装Docker

④使用镜像:

⑤操作容器:

⑥访问仓库:

⑦数据管理:

⑧使用网络:

⑨高级网络配置:

⑩安全:

⑪底层实现:

⑫其他项目:

图片转存中…(img-ln2DazE1-1711462756928)]

⑩安全:

[外链图片转存中…(img-laq4f7or-1711462756928)]

⑪底层实现:

[外链图片转存中…(img-FgFc4qms-1711462756928)]

⑫其他项目:

[外链图片转存中…(img-Jy2eWGWj-1711462756929)]

需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值