线程是一个动态的对象,他表示进程中的一个控制点,并且执行一系列的指令。
需要库
#include<pthread.h>
编译时需要添加库连接,如
gcc -o test test.c -lpthread
线程创建
int pthrea_create(pthread *thread, pthread_attr_t, void*(*start_routine)(void*), void* arg);
线程ID号获取
pthread_t pthread_self()
线程结束
void pthread_exit(void *retval);
简单例子
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void show(char *ptr)
{
int retval;
printf("%s",ptr);
pthread_exit(&retval);
}
int main()
{
pthread_t th1,th2;
char *msg1="I'm thread_one\n";
char *msg2="I'm thread_two\n";
pthread_create(&th1, NULL, (void *)(&show), (void *)msg1);
pthread_create(&th2, NULL, (void *)(&show), (void *)msg2);
return 0;
}
上面程序会出现三种可能
1:出现I'm thread_one后出现I'm thread_two;
2:出现I'm thread_two后出现I'm thread_one;
这两种情况是因为线程是同步执行的,无法保证谁先打印;
3:无打印结果
原因是主程序先执行return后,其他线程也随之终止。如要打印可在return前添加sleep函数,但这不一定保险,如线程运行时间过长时,return也会比线程先结束;挂起线程是其解决办法;
挂起线程
int phread_join(phread_t, void**thread_return);
th为线程标识符
thread_return存放其他线程的返回值
在上面程序return的上面添加
void *retval
phread_join(th1, &retval);
phread_join(th2, &retval);