Linux环境下如何建立线程(linux建立线程)
在Linux系统中建立线程实际上非常简单,主要有两种方法:两个函数 pthread_create 和 clone。
使用 pthread_create 方法建立线程
使用 pthread_create 是最常见的创建线程的方法,主要是因为它的语法简单只需几行代码。它的原型如下:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
它的参数介绍如下:
1、thread 创建成功后,返回线程 ID。
2、attr 指定线程属性,通常设置为 NULL。
3、 start_routine 为线程启动时运行的函数或程序段。
4、arg 传递给 start_routine 的参数。
例子:
#include
#include
void *print_message_function( void *ptr );
main()
{
pthread_t thread1, thread2;
const char *message1 = “Thread 1”;
const char *message2 = “Thread 2”;
int iret1, iret2;
iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);
pthread_join( thread1, NULL);
pthread_join( thread2, NULL);
printf(“Thread 1 returns: %d\n”, iret1);
printf(“Thread 2 returns: %d\n”, iret2);
exit(0);
}
void *print_message_function( void *ptr )
{
char *message;
message = (char *) ptr;
printf(“%s \n”, message);
}
使用 clone 方法建立线程
clone是Linux内核规定新线程拥有和父进程完全相同的地址空间时,可以使用它来创建线程。它的原型如下:
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, int *parent_tid, struct user_desc *tls, int *child_tid);
它的参数介绍如下:
1、fn 创建线程时执行的函数指针。
2、child_stack 子线程使用的堆栈指针。
3、flags 指定进程地址空间的复制方式。
4、arg 参数传递给 fn。
5、parent_tid 指向父线程 ID 的指针。
6、tls 指定注册的 TLS 段。
7、child_tid 返回子线程 ID 的指针。
例子:
#include
#include
#include
#define STACK_SIZE 1024 * 64
char child_stack[STACK_SIZE];
int thread_function(void *param)
{
printf(“I’m new thread!\n”);
return 0;
}
int main()
{
clone(thread_function, child_stack + STACK_SIZE,
CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM,
NULL);
printf(“Main thread finished!\n”);
return 0;
}
总而言之,在Linux环境下建立线程使用pthread_create和clone两种方式,只要读者在使用时分清楚两种函数功能,就可以成功编写出需要的多线程程序。