C语言中的线程问题

时间:2011-06-11 11:43:47

标签: c multithreading pthreads

我在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次确定

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次确定

3 个答案:

答案 0 :(得分:2)

已经启动。是什么让你觉得,它不是?这完全是异步的。

答案 1 :(得分:2)

所以你说你正在开始一个线程并且该线程在你准备好之前一直运行直到完成,并且你想要更好地控制它?查看线程同步 - 信号量和互斥量等工具(pthreads库可以帮助您)。这些是用于允许线程以更加可控的方式互操作的一些工具。

答案 2 :(得分:2)

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

此外,代码遭受海森堡问题的困扰。观察线程的方式正在影响它们的运行方式。您使用的日志记录功能具有锁定功能,可确保日志记录输出不会混合。非常可能的情况,特别是因为您没有在线程中执行任何实际工作,操作系统调度程序在锁定时会引发线程上下文切换。另一个线程正在尝试获取锁,在第一个线程释放它之前无法工作。这很少。

在让线程延长寿命,执行更多工作之前,您不会观察到并发性。并且在其他线程试图获取的很长一段时间内都不会锁定。