数字跳动 2015-12-24 08:05 采纳率: 100%
浏览 1439
已采纳

关于线程的几个问题,望大神不吝赐教

1、双线程,对一个公共区间读写时,需要加锁,即一个线程“写”完后再由另一个线程“读”,不断循环。那这种方式与另外一种方式有什么区别:在一个main函数中写一个(死)循环,循环内先安排“写”程序,再安排“读”程序,不使用线程。

2、做TCP全双工通信时(例如语音对话),发送和接收数据在分别用一个线程实现,两个线程没有公共区间。那这种方式和另外一种区别有什么不同:在一个main函数中写一个(死)循环,循环内先安排“发”程序,再安排“收”程序,不使用线程。

3、c语言中,线程创建用pthread_create,此要传输参数时用最后一个参数。问题是:如果要传多个参数时,可以用结构体,但也可以把参数设成全局变量,这两种方式又有什么不同。

以上3个问题,每种情况都是可以实现的,我想请教的是他们之间的区别,望大神们不吝赐教,感谢!

  • 写回答

4条回答 默认 最新

  • wunaidepao 2015-12-24 08:56
    关注

    第一点:如果是两个线程,那么在有互斥锁的情况下,一个线程A先获得资源,当他的操作没有完成是,另一个线程B想要去获得资源,这个时候B就会被挂起,相当于睡觉了,具体的系统机制有点复杂,涉及到CPU时间片,进程内线程的切换。如果是一个MAN函数,里面有两个子函数,一个读一个写,MAN按顺序调用它。那么在相当于是单线程。宏观上看,两种情况的结果差距不大,但是机制不同。同时要考虑的是,第一种情况存在写的线程写多次,或者读的线程读多次,另一个线程才去访问资源的情况。第二种就完全是按程序逻辑去做。
    第二点:如果是两个线程分别负责收发,那么和一个线程即收又发比较起来,肯定是两个线程的速度要快。因为在实际应用中,很可能你读写会阻塞,如果在一个线程里面阻塞了,那么可能会丢失一些信息,比方你在发送的时候阻塞了,但是对端的信息不断地到达本地,那么接受缓冲区的数据满了之后,如果还有数据到达,那么就会覆盖之前的数据。分两个线程的话,当收或者发通道阻塞之后,另一个通道还是好的,就会比较好处理。
    第三点:两种方法的结果没有区别,但是根据应用的情况有区别,全局变量是所有的都可以访问的,而有时候,你的变量是个局部的,没法设成全局,那你就需要在创建线程的时候,把这个变量通过参数传入的方式传入线程。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 用PLC设计纸袋糊底机送料系统
  • ¥15 simulink仿真中dtc控制永磁同步电机如何控制开关频率
  • ¥15 用C语言输入方程怎么
  • ¥15 网站显示不安全连接问题
  • ¥15 github训练的模型参数无法下载
  • ¥15 51单片机显示器问题
  • ¥20 关于#qt#的问题:Qt代码的移植问题
  • ¥50 求图像处理的matlab方案
  • ¥50 winform中使用edge的Kiosk模式
  • ¥15 关于#python#的问题:功能监听网页