知微:上拉引申的IF

昨天晚上想到一个问题,对于页面的上拉操作,当多次触发上拉动作时如何避免多次请求。于是这样实现了一下。

let i=0
if(i==0)
    up

发现这样可以解决多次上拉问题。看似解决了,不过其中的if判断语句存在一个条件竞争的问题。于是想了一条理由,是由于JavaScript编译执行的逻辑问题,造成的一定延迟,所以没有存在条件竞争。于是我用C++重新写了一个类似的。

#include "windows.h"
int i = 0; 
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
    Sleep(300);
    printf( "3,");
    i = 0;
    return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
    if (i == 0){
        i = 1;
        printf( "0,");
        CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);
    }
    else
    {
        printf( "1,");
    }
    return 0;
}
  
int _tmain(int argc, _TCHAR* argv[])
{ 
    for (size_t i = 0; i < 1000; i++)
    {
        CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL);
    }
    getchar();
    return 0;
}

于是你会发现它还是很好的解决了上拉的问题。由于C++编译后的opcode接近机器码,所以JavaScript存在的编译执行问题,它不存在。但是它依旧没有多次打印“0”。这里伪造多次是通过线程。让我想到Cpu的问题。Cpu切片和线程执行。从代码来看,它存在竞争问题,但是总和一些外在因素,它规避了问题。想来想去还是没有答案,为什么会规避掉竞态问题。


知微:上拉引申的IF


本站如无特别说明即为原创,转而告知:(http://iwonmo.com/archives/1598.html)

标签: 竞态

添加新评论