多线程编程
1,对比多线程与多进程
启动新进程的开销比新线程大很多,进程切换开销也大于线程切换;
线程间的通信比进程间通信方便,但线程间需要同步共享数据。
2,以pthread为例介绍多线程编程
创建工作线程函数:
void *thread(void *ptr)
{
for(int i = 0; i < 5;i++) {
sleep(10);
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;
}
for(int i = 0;i < 5;i++) {
cout << "This is the main process." << endl;
sleep(10);
}
pthread_join(id, NULL);
return 0;
}
因为CPU为不同线程分配时间片,上面的执行结果可能不一样。
3,函数pthread_create
第二个参数可以设置线程属性,第四个参数设置运行函数的参数。
线程属性结构为pthread_attr_t,需要通过相关api函数设置,属性内容有:是否绑定、是否分离、堆栈大小和优先级。
4,线程数据
在单线程里,有两种基本数据:全局变量和局部变量。在多线程里,多了线程数据(TSD),这种数据在线程内部类似全局数据,所有函数都可以访问,在其它线程不可见。
需要为每个线程数据创建一个键,在线程内部,代表同样的内容,在不同线程里,数据是不一样的。
有相关API函数创建和使用:创建一个键;为键指定线程数据;从键读取线程数据;删除键。
5,同步对象互斥锁
锁定和解锁
6,条件变量
阻塞线程并等待其它线程发送信号,常和互斥锁一起使用
7,信号量
非负的整数计数器。