问题描述
- 关于线程的几个问题,望大神不吝赐教
-
1、双线程,对一个公共区间读写时,需要加锁,即一个线程“写”完后再由另一个线程“读”,不断循环。那这种方式与另外一种方式有什么区别:在一个main函数中写一个(死)循环,循环内先安排“写”程序,再安排“读”程序,不使用线程。2、做TCP全双工通信时(例如语音对话),发送和接收数据在分别用一个线程实现,两个线程没有公共区间。那这种方式和另外一种区别有什么不同:在一个main函数中写一个(死)循环,循环内先安排“发”程序,再安排“收”程序,不使用线程。
3、c语言中,线程创建用pthread_create,此要传输参数时用最后一个参数。问题是:如果要传多个参数时,可以用结构体,但也可以把参数设成全局变量,这两种方式又有什么不同。
以上3个问题,每种情况都是可以实现的,我想请教的是他们之间的区别,望大神们不吝赐教,感谢!
解决方案
第一点:如果是两个线程,那么在有互斥锁的情况下,一个线程A先获得资源,当他的操作没有完成是,另一个线程B想要去获得资源,这个时候B就会被挂起,相当于睡觉了,具体的系统机制有点复杂,涉及到CPU时间片,进程内线程的切换。如果是一个MAN函数,里面有两个子函数,一个读一个写,MAN按顺序调用它。那么在相当于是单线程。宏观上看,两种情况的结果差距不大,但是机制不同。同时要考虑的是,第一种情况存在写的线程写多次,或者读的线程读多次,另一个线程才去访问资源的情况。第二种就完全是按程序逻辑去做。
第二点:如果是两个线程分别负责收发,那么和一个线程即收又发比较起来,肯定是两个线程的速度要快。因为在实际应用中,很可能你读写会阻塞,如果在一个线程里面阻塞了,那么可能会丢失一些信息,比方你在发送的时候阻塞了,但是对端的信息不断地到达本地,那么接受缓冲区的数据满了之后,如果还有数据到达,那么就会覆盖之前的数据。分两个线程的话,当收或者发通道阻塞之后,另一个通道还是好的,就会比较好处理。
第三点:两种方法的结果没有区别,但是根据应用的情况有区别,全局变量是所有的都可以访问的,而有时候,你的变量是个局部的,没法设成全局,那你就需要在创建线程的时候,把这个变量通过参数传入的方式传入线程。
解决方案二:
线程有系统内核线程与用户线程之分。
每一个系统内核线程对应一个逻辑CPU,由操作系统进行统一调度;
用户线程实际上只对应一个逻辑CPU,在线程内部进行多任务切换,每个任务必须及时释放CPU,将时间片让给其他的任务。操作系统对此并不知情。
详见Windows的“线程”和“纤程”这两个不同的概念。
解决方案三:
关于线程的几个问题
解决方案四:
1.你读写是有目的的啊,你在一个线程里读写一段数据,玩儿呢
2.全局变量和局部只是存放位置的区别,
解决方案五:
就是资源消耗多少的问题