Linux的线程通信
一、线程概述
(1)线程与进程的区别:
1.进程运行的时候,要分配空间,用来保护它的数据段,代码段还有堆和栈等,而线程的空间是共享的,多个线程运行的时候不会开辟新的空间,这样就效率快很多。
2.相对多进程来说,多线程是一种非常"节俭"的多任务操作方式。
(2)线程的优点:
1.省内存,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且,线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。
2.进程间通信不方便,比较耗内存,而线程是用共享内存的,数据改变直接读取共享内存就知道,当然,数据共享也会带来一些问题,但可以用条件或者锁来控制。
(3)线程间的通信方式
多线程开发的最基本概念主要包含三点:线程,互斥锁,条件。
线程操作有3种操作:线程的创建,退出,等待 。
互斥锁则包括 4 种操作,分别是创建,销毁,加锁和解锁。
条件操作有 5 种操作:创建,销毁,触发,广播和等待。
二 、线程
1. 线程创建
#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
// 返回值:若成功返回0,否则返回错误编号
2. 线程退出
单个线程可以通过以下三种方式退出,在不终止整个进程的情况下停止它的控制流:
1)线程只是从启动例程中返回,返回值是线程的退出码。
2)线程可以被同一进程中的其他线程取消。
3)线程调用pthread_exit:
#include <pthread.h>
int pthread_exit(void *rval_ptr);
rval_ptr是一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程可以通过调用pthread_join函数访问到这个指针。
3. 线程等待
#include <pthread.h>
int pthread_join(pthread_t thread, void **rval_ptr);
// 返回:若成功返回0,否则返回错误编号
代码如下:
#include<stdio.h>
#include<pthread.h>
int data = 0;
void *fucn1(void *arg)
{
printf("t1: thread id is %ld\n",(unsigned long)pthread_self());
printf("t1: param is %d\n",*(int *)arg);
while(1)
{
printf("t1 :%d\n",data++);
sleep(1);
}
}
void *fucn2(void *arg)
{
printf("t2: thread id is %ld\n",(unsigned long)pthread_self());
printf("t2: param is %d\n",*(int *)arg);
while