2011-06-11 48 views
0

我使用线程用C如下问题:与线程用C

pthread_t thread; 
if (pthread_create (& thread, NULL, thread_func (in, out), NULL)! = 0) 
{ 
    return -1; 
} 
// code goes further 

所以一切正常,但公告之后线程的代码立即只是整个线程后执行,但不是。如何让线程开始并与他一起进一步的代码?

编辑: 我的意思是说我更新流程后编写的代码只在函数thread_funts完成工作后才开始播放。我需要在更新流之后同时工作流程和代码。例如:

static void * thread_func() 
{ 
    int i; 
    for (i = 0; i!=40; i++) 
    { 
     __android_log_print(ANDROID_LOG_INFO, "SDL", "OK"); 
    } 
} 

JNIEXPORT jint JNICALL Java_org_divenvrsk_android_hellondk_HelloNDK_work (JNIEnv * env, jobject obj, jbyteArray array) 
{ 
    pthread_t thread; 

    if (pthread_create (& thread, NULL, thread_func(), NULL)! = 0) 
    { 
    return -1; 
    } 
    __android_log_print(ANDROID_LOG_INFO, "SDL", "gggggggg"); 
} 

我得到这个:

06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 

这里40次OK

06-11 20:01:20.955: INFO/SDL(5238): gggggggg 

即,首先进行整个线程,然后进一步的代码,我需要满足同时,线程和公告线程后的代码。 也就是说,它是必要的,发生这样的地方:

06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.955: INFO/SDL(5238): gggggggg 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 
06-11 20:01:20.951: INFO/SDL(5238): OK 

这里40次OK

+2

这很难理解你在问什么。你可能会张贴你所看到的一些“模拟”输出(就像在这个代码和'thread_func'中都有一个printf一样),并发布你想要发生的事情吗? – Mat 2011-06-11 11:47:10

+1

发布真实的代码。 – cnicutar 2011-06-11 11:47:43

+0

如果您想暂停当前线程并让其他线程完成某项工作,请调用[pthread_yield](http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_yield.3.html)在当前线程中。 – 2011-06-11 12:14:59

回答

2

所以你说你开始一个线程,并且该线程一直运行,直到你准备好完成,并且你想更好地控制它?研究线程同步 - 诸如信号量和互斥体(pthreads库可以帮助你)的工具。这些是用于允许线程以更受控制的方式相互操作的一些工具。

+0

我更新了问题。看一看。 – Kyborg2011 2011-06-11 17:09:17

+0

是的,但同步仍然是你的朋友。如果你希望第二个线程在第一个完成之前得到一些运行时间,第一个需要等待,例如第二个线程发布的信号量。这可能会导致第二个线程在第一个运行时间之前完成,尽管......除了多核系统(如@Hans状态),线程并不真正并行运行。如果线程需要互操作,则需要为它们提供同步代码(通过信号量,互斥锁或其他通信)。 – mah 2011-06-15 11:39:54

2

已经开始。是什么让你思考,事实并非如此?它完全是异步的。

+0

@Kyborg,验证这一点的方法是让主要方法在启动线程后立即打印一些字符串,并让线程休眠一会然后打印一些内容。您应该在新线程之前看到主方法的输出。 – SubmittedDenied 2011-06-11 11:55:47

+0

我更新了问题。看一看。 – Kyborg2011 2011-06-11 16:40:09

2

这在Android类设备上不会出现异常行为。在具有多个内核的计算机上运行代码时,只能获得真正的并发性。这在Android设备上不太可能,特别是在模拟器上运行代码时。通过定期切换上下文来模拟并发性,让cpu执行线程的代码一段时间。这些上下文切换不会非常频繁地发生。每4毫秒肯定少于一次。

此外,代码患有海森堡问题。你观察线程的方式正在影响它们的运行方式。您使用的日志功能类型具有锁定功能,以确保日志记录输出不会混杂在一起。一个非常可能的情况,特别是因为你没有在线程中做任何真正的工作,就是操作系统调度器在锁被保持时引发线程上下文切换。另一个线程正在尝试获取该锁,直到第一个线程释放它才会工作。它很少这么做。

直到让线程寿命更长,执行更多工作之后,您才会观察到并发性。并且在其他线程试图获得的很长一段时间内不会持有锁。