go语言等待线程结束 golang 等待协程退出

golang多线程简单逻辑实现指定个核心最大化使用,比如核心总数减一 。
必要的库 。
要使用的cpu数量,建议不全使用 。
建立管道 。
声明使用的cpu数 。
建立互斥关系,本例中主要为go语言等待线程结束了实现所有线程执行完后再执行后续程序 。
创建cpu数减1个线程
后面每个任务结束时要done一个wg,这里根据具体情况加,是循环就在每个循环里加,保证后面能全部done即可
没有缓冲的、阻塞式的往管道传递字符串 。
Wait是等所有线程都执行完,即增加的数字被全done掉 。
关闭管道 。
假设已有的函数是ReadLogs , 在它的基础上加个Wg加函数名的新函数,go语言等待线程结束我觉得这种方式不改变原有的 , 比较舒服 。
大意是:循环从管道读取字符串,读不到go语言等待线程结束了就跳出循环 。
每个ReadLogs()之后加一个wg.Done() , 相当于计数减一 。
【go语言等待线程结束 golang 等待协程退出】 ReadLogs()就是要执行的任务,不再解释 。
就是开指定个线程 。
管道阻塞传值 。
wg同步 。
WgReadLogs循环接收 。
如何等待一个线程结束然后返回运行结果用join:try{t1.join();t2.join();tn.join();}catch(Exceptione){}//等待N个线程执行完成后再执行的语句
go语言无缓冲的channel无缓冲的通道(unbuffered channel)是指在接收前没有能力保存任何值的通道 。
这种类型的通道要求发送goroutine和接收goroutine同时准备好,才能完成发送和接收操作 。否则 , 通道会导致先执行发送或接收操作的 goroutine 阻塞等待 。
这种对通道进行发送和接收的交互行为本身就是同步的 。其中任意一个操作都无法离开另一个操作单独存在 。
阻塞:由于某种原因数据没有到达,当前协程(线程)持续处于等待状态,直到条件满足,才接触阻塞 。
同步:在两个或多个协程(线程)间,保持数据内容一致性的机制 。
下图展示两个 goroutine 如何利用无缓冲的通道来共享一个值:
在第 1 步,两个 goroutine 都到达通道 , 但哪个都没有开始执行发送或者接收 。
在第 2 步,左侧的 goroutine 将它的手伸进了通道,这模拟了向通道发送数据的行为 。这时 , 这个 goroutine 会在通道中被锁住,直到交换完成 。
在第 3 步,右侧的 goroutine 将它的手放入通道,这模拟了从通道里接收数据 。这个 goroutine 一样也会在通道中被锁住,直到交换完成 。
在第 4 步和第 5 步,进行交换 , 并最终,在第 6 步,两个 goroutine 都将它们的手从通道里拿出来,这模拟了被锁住的 goroutine 得到释放 。两个 goroutine 现在都可以去做别的事情了 。
如果没有指定缓冲区容量,那么该通道就是同步的,因此会阻塞到发送者准备好发送和接收者准备好接收 。
无缓冲channel: —— 同步通信
如何等待线程结束等待一个线程的结束
Win32 提供WaitForSingleObject()函数 , 其第一个参数是一个核心对象(如线程)的 handle 。为方便讨论,把等待线程称为线程#1,把被等待线程称为线程#2 。
调用 WaitForSingleObject()并放置一个“线程句柄”作为参数 , 将使线程#1开始睡眠,直到线程#2结束 。像Sleep()函数一样,WaitForSingleObject()也有一个参数用来指定最长的等待时间 。
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
);
hHandle:等待对象的 handle(代表一个核心对象) 。
dwMilliseconds:等待的最长时间 。时间终了,即使 handle尚未成为激发状态,此函数也要返回 。此值可以是0(代表立刻返回),也可以是 INFINITE代表无穷等待 。
如果函数失败,返回WAIT_FAILED 。这时可调用 GetLastError()取得更多信息 。
此函数的成功有三个因素:
1. 等待的目标(核心对象)变成激发状态 。返回值为WAIT_OBJECT_0 。
2. 核心对象变成激发状态之前,等待时间终了 。返回值为WAIT_TIMEOUT 。
3. 如果一个拥有mutex(互斥器)的线程结束前没有释放mutex,则传回 WAIT_ABANDONED 。(abandoned:废弃)
获得一个线程对象的 handle之后,WaitForSingleObject()要求操作系统让线程 #1 睡眠 , 直到以下任何一种情况发生:
1. 线程#2结束
2. dwMilliseconds时间终了 。该值系从函数调用后开始计算 。
由于操作系统持续追踪线程#2,即使线程#2 失事或被强迫结束,WaitForSingleObject()仍然能够正常运作 。
如果想一直等待某个线程,直到线程退出 , 可以用如下代码:
WaitForSingleObject( hThrd, INFINITE );
关于time-out,有一个特别重要的用途,但很少被人注意 。设定time-out为0,能够检查handle的状态并立刻返回,没有片刻停留 。如果handle已经备妥 , 那么这个函数会成功并传回 WAIT_OBJECT_0 。否则,这个函数立刻返回并传回 WAIT_TIMEOUT 。
另外可以利用 time-out提供一个动画,表示正在等待某个线程的结束 。可以每 500毫秒就time-out一次 , 更新图示,然后再继续等待 。
WaitForSingleObject()可以面对许多种 handles工作 , 不一定非要是的线程 handle 。事实上,Win32中大部分以HANDLE表示的对象都能够作为 WaitForSingleObject()的等待目标 。视所拥有的对象不同,操作系统等待的事情也不一样 。形式上来说 , 系统等待着这一对象“被激发” 。
怎么让当前线程等待另一个线程完成之后再去执行1、这里简单的做一个小demo,项目的结构如图所示,就一个文件即可 。
2、使用for循环将num每次减一输出,这里是使用的是实现runnable接口 。
3、这里创建了三个进程作为多个线程的测试,代码如图所示,。
4、然后运行我们的代码,在输出栏可以看到这里三个线程将num的值一起减到0 。
5、让程序在执行for循环中的一次循环时只有一个线程操作,如图所示 我们将其睡眠一个时间 。
6、然后再次多次运行代码 你会看到三个线程都在不同占比的执行循环减操作,如果将sleep中的数字增加到一定数值时,你会看到三个线程分布的越有序 。
go语言等待线程结束的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于golang 等待协程退出、go语言等待线程结束的信息别忘了在本站进行查找喔 。

    推荐阅读