uc第12天线程编程

 


===========================线程编程==========================

回顾:
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  ,线程的一种控制资源的方法,也可以用信号量,条件变量。

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值