-1

在许多编程语言中,已经提出了许多问题来停止执行thread.In c/c++ goto仍然使用,其中如 in Java,不使用 goto ,但仍然保留它;stop()、stop(Throwable) 和suspend()、destroy() 和resume(),它们旨在提供启动和停止线程的基本功能已被弃用。我们可以使用gototo 简单地移出线程吗?

像这样的东西:

//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

从评论中,这是解决方案吗?

更新2:

好吧,我得到了各种各样的答案。有些是的,有些不是。我不太使用 c/c++,否则本可以实现并看到自己。

4

6 回答 6

7

这行不通。

  1. 你不能goto用另一种方法。
  2. 线程不绑定方法,一个方法可以由多个线程执行。

如果该goto位置在同一方法中,则执行将简单地在执行该goto语句的线程中的新位置继续。

可以做的是转到线程方法的末尾 - 如果当前代码在该方法中。这不会结束线程,但goto会在线程方法结束之前移动程序流,这将导致线程方法完成执行,从而结束线程。这与从 thread 方法中简单地 ing
效果相同。return

于 2013-01-08T13:47:10.183 回答
2

当然,您可以:您goto几乎可以在任何地方使用无条件地将控制转移到您的方法的末尾,几乎没有限制。如果这是实现您的线程的方法,它将退出,结束线程。

你是否应该是一个不同的问题:除了极少数例外,goto这会使你的程序的可读性降低;没有例外,您可以在没有 的情况下获得相同的结果goto,同时提高可读性。例如,您可以使用return来结束实现线程逻辑的方法。

于 2013-01-08T13:48:29.310 回答
1

您不能使用 goto “移出”线程。线程的执行不限于给定范围,只是移动到代码中的另一个位置不会终止它。

于 2013-01-08T13:47:34.853 回答
1

首先,将清理代码放在函数末尾,然后跳转到它goto是 C 中非常有效的模式。只要它使代码更清晰、更容易理解,就使用它。当然,它可能会被滥用,而且当你有多个级别的函数时它就不能很好地工作,所以它可能会鼓励制作太长的函数只是为了能够转到清理代码。但只要小心使用,goto在 C 中是相当有效的。另外,由于问题有点模糊,最好明确地说:你不能goto在函数之间。在支持异常的语言中,您应该使用它们而不是goto(当然您也必须正确使用它们,而不是滥用它们)。

但通常,尤其是对于线程,最好为线程注册清理处理程序,这样您就可以返回或调用线程框架“退出此线程”函数,而不是使用goto清理代码。

最后,使用上面的代码,out:标签后没有代码,你可以return代替使用goto... 这假设你正在使用一个线程库,它需要一个函数在其他线程中运行,并在该函数返回时结束线程.

于 2013-01-08T13:48:31.010 回答
1

你不能从你的线程函数中转到标签

您可以out:在线程函数的末尾设置 。这样,如果你想停止你的线程,你可以(从你的线程函数的任何地方)并且线程函数将被goto停止out:

如果您想在线程结束时执行部分代码,您可以使用pthread_cond_signal(&cond);

以下链接包含如何使用它的示例:多线程启动顺序

于 2013-01-08T13:51:35.827 回答
1

不,你不能。

但也许您不需要...您可以尝试使用 ThreadAbortException(通过调用 Thread.Abort())并捕获它(是的,在线程内),执行“输出”功能,然后执行 Thread.ResetAbort . 当从另一个线程调用 abort 时(您似乎没有这样做),请小心并确保阅读 MSDN 中涉及的风险。

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

于 2013-01-08T13:53:31.987 回答