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

     

     

  • 相关阅读:
    存储过程与触发器的区别
    WebDriver基本操作入门及UI自动化练手页面
    第四章 TestNG测试用例分步解析(上)
    第三章 Webdriver Java API简介(下)
    第三章 Webdriver Java API简介(上)
    第二章 TestNG环境搭建
    第一章 TestNG框架自动化简述
    基于Selenium2和TestNG的自动化测试
    程序员都应该知道的福利
    TestNG系列教程:并行执行测试
  • 原文地址:https://www.cnblogs.com/smartjourneys/p/8214321.html
Copyright © 2011-2022 走看看