本人在做Android NDK移植的时候遇到了C语言线程,当然线程这些内容在谭浩强的书中根本没有介绍。Android系统用的是Linux内核,所以Linux C多线程编程对Android NDK非常重要,Android Framework中用到这些会更多。
废话不多说,我们切入正题。
如何创建一个多线程?
以下就是创建线程的函数:
int pthread_create(pthread_t *thread,pthread_attr_t* attr ,void *(*start_routine)(void*),void * arg);
返回值:成功返回0,失败返回错误号。
参数:
pthread_t *thread :表示的是一个指向本线程的id的地址。由此可见线程id的类型是pthread_t,它保证当前进程的线程唯一性。在不同的系统中pthread_t 类型可能是不同的类型,它可能是一个整数、结构体。也可以是一个地址。
pthread_attr_t* attr:表示的是线程属性,这里不多讲。我们一般把它设为NULL,它会取系统的默认值。
void *(*start_routine)(void*):它是一个函数地址,一旦线程启动的时候,这个函数就会回调,类似Java线程中的run()方法。
void * arg:表示start_routine回调函数的参数,Java中run方法没有参数。这是它们的重要区别。
创建文件thread01.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_t ntid;
void printids(const char* s)
{
pid_t pid;
pthread_t tid;
pid = getpid(); //这里表示当前进程ID
tid = pthread_self(); 这里表示当前线程ID
printf("=================%sthread,pid=%d,tid==%u\n",s,(int)pid,(unsigned int)tid);
}
void *fn(void *arg)
{
printids(arg);
return NULL;
}
int main(void)
{
int err;
err = pthread_create(&ntid,NULL,fn,"new ");
printids("main ");
sleep(1); //睡眠一秒
return 0;
}
编译运行:
root@jefry-laptop:/home/jefry/Desktop/thread# gcc thread01.c -lpthread
root@jefry-laptop:/home/jefry/Desktop/thread# ./thread01.out
=================new thread,pid=2055,tid==3079015280 //这是非主线程运行的结果
=================main thread,pid=2055,tid==3079018176 //这是主线程运行的结果