===========================线程编程==========================
回顾:
1。共享存储段,消息队列,信号量集 统一称为 XSI IPC
他们的共同特点:都是内核提供管理,首先需要一个key(key_t),使用key向内核申请创建IPC结构,一个IPC结构对应一个由内核管理的通信空间(一块共享的物理内存,一个链表组成的队列,一个计数器变量),IPC结构生存后会有一个id,用户程序拿到id后就可以对ipc结构及通信空间进行操作。
*** 当多个进程需要共同的一个计数器时,可使用信号量集。**
2。线程是由另外的线程启动的。 会参与cpu的竞争,在cpu外面排队等待执行。
上课:
1。线程返回值:0 成功,其他错误码表示想对应的错误。 (这就是线程出错的机制,与普通的出错的区别就是:他错误不会改变全局errornum变量,而是直接返回错误码。)
所以,线程错误,不能够用perror、errornum来找错误,只能通过他的错误码来表示:例如:printf("%s",strerror(res));
2.pthread_create 创建一个线程呢个 pthread_join(id,NULL) 等待一个线程的结束(一直阻塞在那里) 第二个参数是用来接受那个结束线程的返回值,是个void* 指针。 所以,线程的返回值,必须具有全局性,因为返回的是指针。除非返回一个int型,他是4个字节,那么我们可以把他当作指针来传递过来。
下午:
一。线程传参:
1。pthread_create(&id , 0 , task2 ,(void*)&x/*这是参数*/);
2。如果一项操作非常耗时,但是主线程又有自己的事情要去做,那么不应该让主线程等这个操作,应该启动一些线程来执行这个复杂的操作。那么我们用线程最好。
* 使用math时,要加上 -l m 库,math库才能使用math函数。
*把整数当地址传,把地址当整数来取值,这样也是可以的,因为整数也是4个字节。
3。主线程给其他线程传的参数,有可能那个线程没有执行完。那个参数在主线程内可能被修改了,那么可能会影响那个线程。
4。线程是同时执行的。双核、多核则更是如此。 对于单核来说:从理论上一个时间段上是同时执行,一个时间点上是一个线程在执行。
二。pthread_t id; 不同平台,pthread_t不一样,我们这台是无符号长整形。
pthread_self() => 得到当前线程id
if( pthread_equal(id,id2) ){ "属于同一个线程" } 使用 id == id2 来判断,有些系统是不通用的。所以最好用 xx_equal()
三。线程终止
1。 正常结束
1。return
2. pthread_exit(&i);同return 一样 (注意:exit(-1)是让该进程挂)
2。非正常结束
1。其他线程的干扰
2。自身运行出错了
四。
同步方式(合并方式) pthread_join() ;
异步方式(分离状态) 即不等待其他的线程,这种情况用得比较多,因为多线程的目的本来就是要提高效率,多任务,如果我要等你作完我才作的话,那我还不如什么都自己作完算了。
五。
临界资源:即多个线程共享一些数据,这些公共的数据即临界资源
临界区:即要访问临界资源的代码段,代码区块。
多个线程共同访问公共数据,这就导致数据可能不一致的情况。(临界资源问题) 所以我们要保证同一个时刻有一个线程访问临界区,以保证数据的完整。
2。互斥锁(互斥量)来解决访问共享资源(临界资源)的问题。
1。pthread_mutex_t lock; //锁
2。初始化锁有2种方法:1。函数:pthread_mutex_init(锁指针,属性0); 0表示使用默认属性 2。直接赋值 ,这要使用预定义的宏:PTHREAD_MUTEX_INITLALIIER 这样,他就相当与第一种方式,但是属性是0,不可设置罢了。
加锁函数:pthread_mutex_lock(&lock)
解锁函数:pthread_mutex_lock(&lock)
加解锁要在临界区之前,之后加,解。 每个线程的临界区都要作,否则没有效果的。
释放锁:pthread_mutex_destroy(&lock) ;
加锁可以保护一段代码段的完整执行。 同时也会导致该区域不能够并发的执行。所以,我们要只搞那一点点代码访问资源的代码来加锁。
死锁:多个资源的情况下,资源都被锁住,相互申请阻塞导致。
解决死锁函数:pthread_mutex_trlock() :试着给他加上锁,如果能锁,那么就锁住,如果不能锁,那么就走。不会导致锁不到还阻塞。 0 表示可以并且锁住了。 非0表示不能锁住。
锁的函数有5个: 1 init 2 destroy 3 lock 4 trylock 5 unlock ,线程的一种控制资源的方法,也可以用信号量,条件变量。