csdnyxy0924 2016-04-20 09:59 采纳率: 100%
浏览 2046
已采纳

操作系统,进程同步实验的问题

操作系统 进程同步 实验中 我们模拟了这一个小小的程序,如下:

 #include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int c1 = 0;
int c2 = 0;
int will_wait;

int accnt1 = 0;
int accnt2 = 0;

DWORD WINAPI run1( LPVOID p ) {
    unsigned long counter = 0;
    int tmp1, tmp2, r;
    int flag = 1;

    DWORD start, end;

    start = GetTickCount();
    while(flag) {

        c1 = 1;
        will_wait = 1;

        while(c2 && (will_wait == 1));
        // wait loop

        r = rand();
        tmp1 = accnt1;
        tmp2 = accnt2;

        accnt1 = tmp1 + r;
        accnt2 = tmp2 - r;
        counter++;

        if (counter >= 10000000 || accnt1 + accnt2 != 0)
            flag = 0;

        c1 = 0;
    }

    end = GetTickCount();
    printf("Thread %lu:\n", GetCurrentThreadId());
    printf("counter = %lu, execution time = %lu ms\n", counter, (end - start));

    return 0;
}

DWORD WINAPI run2( LPVOID p ) {
    unsigned long counter = 0;
    int tmp1, tmp2, r;
    int flag = 1;

    DWORD start, end;

    start = GetTickCount();
    while(flag) {

        c2 = 1;
        will_wait = 2;

        while(c1 && (will_wait == 2));
        // wait loop

        r = rand();
        tmp1 = accnt1;
        tmp2 = accnt2;

        accnt1 = tmp1 + r;
        accnt2 = tmp2 - r;
        counter++;

        if (counter >= 10000000 || accnt1 + accnt2 != 0)
            flag = 0;

        c2 = 0;
    }

    end = GetTickCount();
    printf("Thread %lu:\n", GetCurrentThreadId());
    printf("counter = %lu, execution time = %lu ms\n", counter, (end - start));

    return 0;
}

int main() {
    HANDLE hFirst = CreateThread(NULL, 0, run1, NULL, 0, NULL);
    HANDLE hSecond = CreateThread(NULL, 0, run2, NULL, 0, NULL);

    // CPU affinity
    SetThreadAffinityMask(hFirst, 1);
    SetThreadAffinityMask(hSecond, 1);

    // INFINITE
    WaitForSingleObject(hFirst, INFINITE);
    WaitForSingleObject(hSecond, INFINITE);

    system("PAUSE");

    return 0;
}

这是软件方法去使两个线程程互斥(我已经把两个线程全绑定到了一个固定的CPU线程上去)。从代码中可以看到,如果没有counter的限制,理想情况应该是两个线程一直跑下去。但我想通过counter的限制,看看在有限时间内这个互斥机制怎么样。但是,问题来了,我的电脑,在一千万次的限制下,竟然**跑不出来**(跑了有几十分钟),后来我又跑到机房电脑上,仍是这样。我试过很多数,一直到七百万都可以,八百万以后就不行了。可是这样的运算量对计算机并不大啊,我很费解,得麻烦各路大神解释一下了。

  • 写回答

1条回答 默认 最新

  • csdnyxy0924 2016-04-20 12:01
    关注

    啊啊啊 各路大神 我明白了!! 我脑残了 真的脑残! 为撒要把俩线程绑到一个处理器上呢。。。绑到不同的处理器上就好了 我真的是脑残。。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码