您的位置:首页 > 运维架构 > Linux

linux多线程的总结(pthread用法)

2013-08-09 19:24 561 查看
#include

int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr,

void *(*start_rtn)(void),void *restrict arg);

Returns: 0 if OK, error number on failure

第一个参数为指向线程标识符的指针。

第二个参数用来设置线程属性。

第三个参数是线程运行函数的起始地址。

第四个参数是运行函数的参数。

当创建线程成功时,函数返回0,若不为0则说明创建线程失败,常见的错误返回代码为EAGAIN和EINVAL。前者表示系统限制创建新的线程,例如线程数目过多了;后者表示第二个参数代表的线程属性值非法.

pthread_create的用法:由于pthread库不是Linux系统默认的库,所以在使用pthread_create创建线程时,需要在编译中请加-lpthread参数,eg:gcc -o test -lpthrea test.c

例1:

#include "pthread.h"

#include "stdio.h"

void* thread_test(void* ptr)

{ while(1)

printf("i am pthread\n");

}

int main()

{

pthread_t pid;

pthread_create(&pid, NULL, test_thread, NULL);

while(1)

printf("i am main pthread\n");

return 0;

}

例2:

#include

#include

pthread_t id;

int ret;

void thread_1()

{

while(1)

{printf(“I am thread\n”);

sleep(1);

}

}

main()

{ret = pthread_create(&id,NULL,(void*)thread_1,NULL);

if(ret != 0)

printf("Create pthread error!\n");

while(1)

{

printf(“I am main thread\n”);

sleep(2);

}

}

例3:

#include

#include

#include

#include

void *thread_function(void *arg);

char message[] = "Hello World";

int main()

{

int res;

pthread_t a_thread;

void *thread_result;

res = pthread_create(&a_thread, NULL, thread_function, (void *)message);

if (res != 0)

{

perror("Thread creation failed");

exit(EXIT_FAILURE);

}

printf("Waiting for thread to finish...\n");

res = pthread_join(a_thread, &thread_result); //pthread_join 阻塞执行的线程直到某线程结束

if (res != 0)

{

perror("Thread join failed");

exit(EXIT_FAILURE);

}

printf("Thread joined, it returned %s\n", (char *)thread_result);

printf("Message is now %s\n", message);

exit(EXIT_SUCCESS);

}

void *thread_function(void *arg)

{

printf("thread_function is running. Argument was %s\n", (char *)arg);

sleep(3);

strcpy(message, "Bye!");

pthread_exit("Thank you for the CPU time");

}

[root@plinux tmp]# cc -D_REENTRANT -I/usr/include/nptl thread2.c -o thread2 -L/usr/lib/nptl -lpthread

[root@plinux tmp]# ./thread2

thread_function is running. Argument was Hello World

Waiting for thread to finish...

Thread joined, it returned Thank you for the CPU time

Message is now Bye!

pthread_join()

void pthread_exit(void *retval)

int pthread_join(pthread_t pid, void **thread_return)

pthread_join()的调用者将挂起并等待th线程终止,retval是调用pthread_exit()的线程(线程ID为pid)的返回值,如果thread_return不为NULL,则*thread_return=retval。

需要注意的是一个线程仅允许唯一的另一个线程使用 pthread_join()等待本线程的终止,并且被等待的线程应该处于可join状态,即非DETACHED状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: