我这里有线程问题吗?

| 我一直在尝试GNU Radio,并遇到了tunnel.py程序。该程序允许您使用Linux TUN / TAP设备通过无线链路建立IP流量隧道。在大多数情况下,它可以正常工作,但是代码的一部分使我感到困惑。 有一个实现“基本MAC层”的类。此类具有回调函数,该函数将新的数据包写入TUN设备。从单独的线程调用此函数(a0ѭ)。 函数“ 1”在传输新数据包之前执行载波侦听。我不明白的是,为什么它在单独的非重叠传输通道上进行传输之前先感测到接收通道。 RX和TX通道都是独立的频率,我们的硬件允许全双工通信。 因此,我的问题是执行
main_loop
时,另一个线程异步调用
phy_rx_callback
函数的含义是什么?问题是我试图理解载波侦听循环的目的,我发现注释该代码会严重降低性能。对我来说,在使用发送通道之前先监视接收通道,实际上将其变为半双工是没有意义的。然后,我看不到使用两个频率的目的,一个用于发送,一个用于接收。我开始怀疑这里是否存在一个奇怪的线程问题。 最初会创建“ 4”类的单个实例。 rx_callback函数的\'pointer \'被向下传递给实际调用它的线程类。这是cs_mac类:
class cs_mac(object):
    def __init__(self, tun_fd, verbose=False):
        self.tun_fd = tun_fd       # file descriptor for TUN/TAP interface
        self.verbose = verbose
        self.tb = None             # top block (access to PHY)

    def set_top_block(self, tb):
        self.tb = tb

    def phy_rx_callback(self, ok, payload):
        if self.verbose:
            print \"Rx: ok = %r  len(payload) = %4d\" % (ok, len(payload))
        if ok:
            os.write(self.tun_fd, payload)

    def main_loop(self):
        min_delay = 0.001               # seconds
        while 1:
            payload = os.read(self.tun_fd, 10*1024)
            if not payload:
                self.tb.send_pkt(eof=True)
                break
            if self.verbose:
                print \"Tx: len(payload) = %4d\" % (len(payload),)
            delay = min_delay
            while self.tb.carrier_sensed():
                sys.stderr.write(\'B\')
                time.sleep(delay)
                if delay < 0.050:
                    delay = delay * 2       # exponential back-off
            self.tb.send_pkt(payload)
好的,所以使用调用
gettid
ctypes.CDLL(\'libc.so.6\').syscall(186))
,我发现调用
rx_callback
函数的线程具有相同的PID,但具有不同的TID。 问题就变成了,用一个单独的线程从主线程中的一个对象(该线程不断循环)中调用一个函数有什么意义?     
已邀请:
  函数main_loop在传输新数据包之前进行载波侦听。我不明白的是,为什么它在单独的非重叠传输通道上进行传输之前先感测到接收通道。 CSMA / CA打算与半双工系统一起使用,在该系统中,所有节点使用相同的频率发送和接收信号。因此,您是对的,如果您以另一种方式进行传输,那么感测RX通道毫无意义。 carrier_sensed()在receive_path.py文件中被调用,因此它应在RX线程中运行。在我的代码中,我注释掉了sys.stderr.write(\'B \')和time.sleep(delay)这两个行,但这似乎并不影响性能。在我的情况下,可能会有所不同,因为我使用的是半双工的XCVR子板。     

要回复问题请先登录注册