2.创建线程
进程被创建时,系统会为其创建一个主线程,而要在进程中创建新的线程,则可以调用pthread_create:
//若线程创建成功,则返回0。若线程创建失败,则返回出错编号
//编译时需要调用libpthread
3.实例代码
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
voidprintids(constchar *s)
{
pid_t pid;
pthread_t tid;
pid = getpid();
tid = pthread_self(); //也可以通过这种方式,在创建后得到自身的进程ID
printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int) pid,
(unsignedint) tid, (unsigned int) tid);
}
void*thr_fn(void*arg) //注意函数类型
{
printids("new thread: ");
returnNULL;
}
intmain(void)
{
interr;
pthread_t ntid; //进程ID
err = pthread_create(&ntid, NULL, thr_fn, NULL);
if(err != 0)
printf("can't create thread: %s\n",strerror(err));
printids("main thread:");
pthread_join(ntid,NULL); //后面介绍这个函数
returnEXIT_SUCCESS;
}
4.编译实例
gcc pthread_creat.c -o pthread_creat -lpthread
5.线程终止
(1)执行完成后隐式退出;
(2)由线程本身显示调用pthread_exit 函数退出;
(3)被其他线程用pthread_cance函数终止: // 在某线程中调用此函数,可以终止由参数thread 指定的线程。
6.线程等待
如果一个线程要等待另一个线程的终止,可以使用pthread_join函数,该函数的作用是调用pthread_join的线程将被挂起直到线程I
D为参数thread的线程终止。
函数定义: int pthread_join(pthread_t thread, void **retval);
thread: 线程标识符,即线程ID,标识唯一线程。
retval: 用户定义的指针,用来存储被等待线程的返回值。
返回值 : 0代表成功。 失败,返回的则是错误号。
7.pthread文件相关总结
数据类型
pthread_t:线程句柄
pthread_attr_t:线程属性
操纵函数:
pthread_create():创建一个线程
pthread_exit():终止当前线程
pthread_cancel():中断另外一个线程的运行
pthread_join():阻塞当前的线程,直到另外一个线程运行结束
pthread_attr_init():初始化线程的属性
pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
pthread_attr_getdetachstate():获取脱离状态的属性
pthread_attr_destroy():删除线程的属性
pthread_kill():向线程发送一个信号
同步函数
pthread_mutex_init() 初始化互斥锁
pthread_mutex_destroy() 删除互斥锁
pthread_mutex_lock():占有互斥锁(阻塞操作)
pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。
pthread_mutex_unlock(): 释放互斥锁
pthread_cond_init():初始化条件变量
pthread_cond_destroy():销毁条件变量
pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程
pthread_cond_wait(): 等待条件变量的特殊条件发生
Thread-local storage(或者以Pthreads术语,称作线程特有数据):
pthread_key_create(): 分配用于标识进程中线程特定数据的键
pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定
pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中
pthread_key_delete(): 销毁现有线程特定数据键
工具函数
pthread_equal(): 对两个线程的线程标识号进行比较
pthread_detach(): 分离线程
pthread_self(): 查询线程自身线程标识号
8.多线程编程实例
//Threads.cpp
#include <iostream>
#include <unistd.h>
#include <pthread.h>
using namespace std;
void *thread(void *ptr)
{
for(int i = 0;i < 3;i++) {
sleep(1);
cout << "This is a pthread." << endl;
}
return 0;
}
int main() {
pthread_t id;
int ret = pthread_create(&id, NULL, thread, NULL);
if(ret) {
cout << "Create pthread error!" << endl;
return 1;
}
pthread_join(id, NULL);
for(int i = 0;i < 3;i++)
{ cout << "This is the main process." << endl;
sleep(1);
}
return 0;
}
//产生的结果就是先执行id那个进程,之后才会执行下面的for循环。