2009-06-05 46 views
1

现在我面临移植作业中的一个问题,当我需要实现一个线程类时,它不仅可以在wince,symbian中工作,而且还可以像iphone一样使用类Unix系统。如何恢复/暂停iphone OS中的pthread?

我拥有一个挂起/恢复界面来实现,除了iPhone之外,wince/symbian中的任何东西都可以使用,我使用posix pthread来完成我的工作,但是我搜索整个docset用于恢复/挂起界面。事情似乎很困难,并行线程在iphone拥有pthread_create_suspended_np,可以创建挂起模式的线程。现在如何在任何时候线程运行之后恢复或暂停线程。

顺便说一句,我搜索谷歌的一些帮助,似乎别人也有这个问题。 一些人建议使用SIGHUP信号,但是这将暂停的全过程,这是绝对不正常。

非常感谢,如果你们可以告诉我一些解决这个问题的方法。

回答

2

从外部尝试和控制线程实际上是一个坏主意。你永远不知道他们暂停时可能处于什么状态。如果他们在其他地方需要的资源上有互斥锁,则可能会很容易导致死锁情况。

我们必须不诉诸任何非便携式并行线程扩展的同时,前创造一个“安全”的暂停功能,我会尽量记得我们是怎么做的。

它由每个线程的悬挂互斥和一个表示线程状态的变量组成。所以我们希望暂停将有一个循环(他们主要是做)的线程去是这样的:

while true: 
    set mystate = suspended 
    claim mymutex 
    yield 
    release mymutex 
    set mystate = running 
    do some work 

和暂停/恢复代码的线程将是:

function suspend (state,mutex): 
    claim mutex 
    while state <> suspended: 
     yield 
function resume (state,mutex): 
    release mutex 
    while state <> running: 
     yield 

什么挂起程序会做的基本上是锁定互斥锁并等待线程进入挂起状态(mystate的写入只能由挂载程序完成,而不必由另一个互斥锁保护)。在保证暂停将被停止之前,suspend函数不会返回。

同样,恢复线程释放互斥体,因此suspendee可以重新启动,然后等待,直到它在返回之前重新启动。

这允许悬挂发生,但在被挂起的线程的控制下。这样做比较安全,因为它可以确保只有在没有任何可能会导致应用程序死锁的锁定时才能在安全的地方暂停。

0

,暂停和恢复正在运行的线程,我相信你需要使用pthread_cond_wait。基本上,它暂停调用线程,直到条件变量变为true。当然,你还需要给每个线程一个找出何时调用该函数的方法。

0

你给我一个线索来解决这个问题,但这种方法或调用pthread_cond_wait只是等待/葛当设计某种情况。如何在不知道更多信息的情况下暂停特殊线程。关于线程,我们只拥有一个线程ID,我们暂停它在另一个线程中,当我们想要恢复暂停的线程时,我们可能只是在任何地方运行resume函数。我们可以做这样的事吗?或任何其他想法?

关于。

+0

如果你有函数挂起线程(pthread_suspend或pthread_suspend_np在某些实现中,但不是Linux,我相信),那么是的,你可以。你只需要意识到后果。我不知道iPhone是否具备这种能力,我只知道即使是这样,我也不会使用它。 – paxdiablo 2009-06-08 06:43:21