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

     

     

  • 相关阅读:
    SpringBoot08-缓存
    Spring注解-自动装配(三)
    Spring注解-生命周期与属性赋值(二)
    Spring注解-组件注册(一)
    剖析SpringMVC流程与整合(八)
    SpringMVC视图解析与配置(六)
    SpringMVC的其他功能(七)
    简单了解SpringMVC(五)
    Java动态代理
    Spring事务(四)
  • 原文地址:https://www.cnblogs.com/smartjourneys/p/8214321.html
Copyright © 2011-2022 走看看