在许多编程语言中,已提出许多问题以停止执行thread
。仍在使用c/c++
goto
,而在Java
中,goto是没用过,但还是保留了; stop(),stop(Throwable)和suspend(),destroy()和resume(),它们旨在提供启动和停止线程的基本功能,已经过折旧。
我们可以使用goto
简单地移出一个帖子吗?
Somethig喜欢这样:
//Thread block
{...
if(some condition)
goto out;
.....
...
}//thread block over
out:
// I am out!!
}
我知道使用goto
是一种非常糟糕的做法,但仍可以这样使用吗?
更新
或者:
//Thread block
{...
if(some condition)
goto out;
.....
...
out:
// I am out!!
}//thread block over
从评论中,这是解决方案吗?
UPDATE2:
好吧,我得到了一些混合答案。有些是,有些没有。我不太使用c / c ++,否则可以实现并看到自己。
答案 0 :(得分:7)
这不起作用。
goto
使用其他方法。如果goto
位置使用相同的方法,则执行只会继续执行goto
语句的线程中的新位置。
你可以做什么,是到了线程方法的最后 - 如果当前代码在那个方法中。这不会结束线程,但是goto
将在线程方法结束之前移动程序流,这将导致线程方法完成执行并因此结束线程。
这与简单return
来自线程方法的效果相同。
答案 1 :(得分:2)
当然,你可以:你可以使用goto
从几乎任何地方无条件地将控制权转移到你方法的最后,只有很少的限制。如果这是实现您的线程的方法,它将退出,结束线程。
是否应该是一个不同的问题:除了极少数例外,goto
会降低您的程序的可读性;没有例外,您可以在没有goto
的情况下获得相同的结果,同时提高可读性。例如,您可以使用return
来结束实现线程逻辑的方法。
答案 2 :(得分:1)
你不能使用goto“移出”线程。线程的执行不仅限于给定的范围,只是移动到代码中的其他位置也不会终止它。
答案 3 :(得分:1)
首先,将清理代码放在函数末尾,并使用goto
跳转到它是C中非常有效的模式。使用它时使代码更清晰,更容易理解。当然它可以被滥用,并且当你有多个级别的函数时它不能很好地工作,所以它可能会鼓励制作太长的函数,只是为了能够转到清理代码。但只要仔细使用它,goto
在C中就非常有效。此外,由于问题有点模糊,最好明确说明:你不能在函数之间goto
。在支持例外的语言中,你应该使用那些而不是goto
(当然你也必须正确使用它们,而不是滥用它们。)
但是经常,特别是对于线程,最好为线程注册清理处理程序,这样你就可以返回或调用线程框架“退出此线程”函数,而不是使用goto
来清理代码
最后,使用上面的代码,out:
标签后没有代码,您可以return
而不是使用goto
...这假设您使用的是线程库,接受一个函数在其他线程中运行,并在该函数返回时结束该线程。
答案 4 :(得分:1)
您无法转到线程函数
之外的标签您可以在线程功能结束时设置out:
。这样,如果你想停止你的线程,你可以goto
out:
(从你的线程函数的任何地方)和线程函数将被停止
如果您想在线程末尾执行代码的某些部分,可以使用pthread_cond_signal(&cond);
以下链接包含如何使用它的示例:multithread launching order
答案 5 :(得分:1)
不,你不能。
但也许你不需要...你可以尝试使用ThreadAbortException(通过调用Thread.Abort())并捕获它(是的,在线程内),执行'out'功能,然后执行Thread.ResetAbort。请注意,当从另一个线程调用abort时,请务必阅读MSDN中涉及的风险(您似乎没有这样做)。