如何在iphone os中恢复/暂停pthread?

时间:2009-06-05 06:05:31

标签: iphone

现在我在我的移植工作中遇到了一个问题,当我需要实现一个不仅适用于wince,symbian以及类似unix的系统(如iphone)的线程类时。

我拥有一个暂停/恢复界面来实现,除了iphone之外什么都没有wince / symbian,我使用posix pthread来完成我的工作,但我搜索整个docset以获得简历/暂停类似的界面。事情似乎很难,在iphone中拥有一个可以在挂起模式下创建线程的 pthread_create_suspended_np 。现在,如果线程在任何时候运行到它的东西,我怎么能恢复或暂停一个线程。

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

非常感谢你们能告诉我一些解决这个问题的方法。

3 个答案:

答案 0 :(得分:2)

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

我们不得不创建一个“安全”暂停功能,而不是在不久之前使用任何非便携式pthread扩展,我会尝试记住我们是如何做到的。

它包含每个线程的挂起互斥锁和指示线程状态的变量。所以我们想要挂起的线程会有一个循环(它们大多数都是这样的),就像这样:

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只能由suspendee完成,不必受另一个互斥锁的保护)。 suspend函数在确保将被停止的情况下才返回。

同样,恢复线程释放了互斥锁,以便suspendee可以重新启动,然后等到它重新启动后再返回。

这允许暂停,但在线程被暂停的控制下。这样更安全,因为它可以确保只有在没有任何可能使应用程序死锁的锁定时才能在安全点暂停。

答案 1 :(得分:0)

要暂停和恢复正在运行的线程,我相信您需要使用pthread_cond_wait。基本上,它会挂起调用线程,直到条件变量变为true。当然,您还需要为每个线程提供一种方法来确定何时调用该函数。

答案 2 :(得分:0)

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

问候。