C 1115 交替打印FooBar

一、題目描述

我們提供了一個類:

class FooBar {
  public void foo() {
    for (int i = 0; i < n; i++) {
      print("foo");
    }
  }

  public void bar() {
    for (int i = 0; i < n; i++) {
      print("bar");
    }
  }
}

兩個不同的線程將會共用一個 FooBar 實例。其中一個線程將會調(diào)用 foo() 方法,另一個線程將會調(diào)用 bar() 方法。

請設(shè)計修改程序,以確保 "foobar" 被輸出 n 次。

示例 1:
輸入: n = 1
輸出: "foobar"
解釋: 這里有兩個線程被異步啟動。其中一個調(diào)用 foo() 方法, 另一個調(diào)用 bar() 方法,"foobar" 將被輸出一次。

示例 2:
輸入: n = 2
輸出: "foobarfoobar"
解釋: "foobar" 將被輸出兩次。

二、程序?qū)嵗?/h1>

方法1.
執(zhí)行用時 :24 ms, 在所有 C 提交中擊敗了40.00%的用戶
內(nèi)存消耗 :8.9 MB, 在所有 C 提交中擊敗了100.00%的用戶

typedef struct {
    int n;
    pthread_mutex_t lock1;
    pthread_mutex_t lock2;
} FooBar;

FooBar* fooBarCreate(int n) {
    FooBar* obj = (FooBar*) malloc(sizeof(FooBar));
    obj->n = n;
    
    pthread_mutex_init(&obj->lock1, NULL);
    pthread_mutex_init(&obj->lock2, NULL);
    
    pthread_mutex_lock(&obj->lock2);
    
    return obj;
}

void foo(FooBar* obj) {
    
    for (int i = 0; i < obj->n; i++) {
        pthread_mutex_lock(&obj->lock1);
        // printFoo() outputs "foo". Do not change or remove this line.
        printFoo();
        pthread_mutex_unlock(&obj->lock2);
    }
}

void bar(FooBar* obj) {
    
    for (int i = 0; i < obj->n; i++) {
        pthread_mutex_lock(&obj->lock2);
        // printBar() outputs "bar". Do not change or remove this line.
        printBar();
        pthread_mutex_unlock(&obj->lock1);
    }
}

void fooBarFree(FooBar* obj) {
    free(obj);
}

方法2.
執(zhí)行用時 :36 ms, 在所有 C 提交中擊敗了31.43%的用戶
內(nèi)存消耗 :8.7 MB, 在所有 C 提交中擊敗了100.00%的用戶

typedef struct {
    int n;
    int foo;
    int bar;
} FooBar;

FooBar* fooBarCreate(int n) {
    FooBar* obj = (FooBar*) malloc(sizeof(FooBar));
    obj->n = n;
    obj->foo = 0;
    obj->bar = 1;
    return obj;
}

void foo(FooBar* obj) {
    
    for (int i = 0; i < obj->n; i++) {
        while(obj->foo) usleep(1);
        // printFoo() outputs "foo". Do not change or remove this line.
        printFoo();
        obj->bar = 0;
        obj->foo = 1;
    }
}

void bar(FooBar* obj) {
    
    for (int i = 0; i < obj->n; i++) {
        while(obj->bar) usleep(1);
        // printBar() outputs "bar". Do not change or remove this line.
        printBar();
        obj->foo = 0;
        obj->bar = 1;
    }
}

void fooBarFree(FooBar* obj) {
    free(obj);
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容