我们可以用“goto”关键字来结束一个帖子吗?

时间:2013-01-08 13:45:17

标签: c# java c++ c goto

在许多编程语言中,已提出许多问题以停止执行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 ++,否则可以实现并看到自己。

6 个答案:

答案 0 :(得分:7)

这不起作用。

  1. 您不能goto使用其他方法。
  2. 线程未绑定到方法,并且一个方法可以由多个线程执行。
  3. 如果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中涉及的风险(您似乎没有这样做)。

另请参阅:http://msdn.microsoft.com/en-us/library/ty8d3wta.aspx