zoukankan      html  css  js  c++  java
  • LwIP Application Developers Manual9---LwIP and multithreading

    1.前言

    lwIP的内核并不是线程安全的。如果我们必须在多线程环境里使用lwIP,那么我们必须使用“upper”API层的函数(netconn或sockets)。当使用raw API时,你需要自己保护你的内核。

    2.并发处理

     (1)Sockets通常来说并不能在多个应用线程中使用(在udp/raw netconn,sendto/recv可以实现)。

     (2)一些上层操作的并发调用必须被应用层直接处理,如:socket,bind,connect,setsockopt和close。

    有些情况必须要lwIP来处理(比如,要知道一个’int socket’的调用在close/socket之间是否都相同是困难的):如下所示

    Task1
      int s1=socket() (tell s1=5)
     Task1,Task2
      use s1 with send,recv (ok, it could be possible).
     Task2
      closesocket(s1)
     Task3
      int s2=socket() (and... it could be s2=5)
     Task1
      send(s1) !!!! Problem, s1 would not the same proto/port than the first we open, 
               !!!! but only application can know that !!!!

    (3)一些操作(recv,recvfrom,send,sendto…)可以变为线程安全。为了使能全双工协议,我们必须将netconn/sockets的一些处理放到api_msg

    (4)一些其它需要了解的信息

    • 一些特别的函数(netif_xxx和dhcp_xxx)在多线程中可能导致问题。这些函数在tcpip_thread使用相同的变量

    (5)一些举例

    • 如果一个应用线程删除了一个netif,但tcpip_thread还在运行,这个会导致一个崩溃。在同一个时间内加入2个netif将会导致接口的丢失,详情请查看https://savannah.nongnu.org/bugs/?19347
    • 如果有一个应用线程停止了一个接口的dhcp,由于netif’s dhcp字段被dhcp’s定时器使用(在tcpip_thread线程运行),你将导致一个崩溃,详情请查看https://savannah.nongnu.org/patch/?5798

    为了避免先前2个问题,你可以使用”netif api”,该api非常接近于‘netif’和‘dhcp’API

     

     

  • 相关阅读:
    sqllite小型数据库的使用
    winform打开本地html页面
    【app】自动化必备之adb使用
    【app】自动化环境搭建(Appium)for java
    【app】Hybrid?Native?不知道你就out了!
    589. N叉树的前序遍历
    590. N叉树的后序遍历
    897. 递增顺序查找树
    559. N叉树的最大深度
    108. 将有序数组转换为二叉搜索树
  • 原文地址:https://www.cnblogs.com/smartjourneys/p/8214321.html
Copyright © 2011-2022 走看看