2011-02-09 80 views
0

我正在介紹操作系統課程,我們將在linux中使用clone()調用來創建線程,然後使用它們做一些事情。我似乎只是在使用clone()。如何在類和名稱空間的linux中克隆()?

我已經構建我的代碼到一個單獨的類(稱爲作業),這是在命名空間中的類(課程)。這可能是問題,因爲這是我第一次真正使用namespace關鍵字。我試圖用我很少做的事來變得更有經驗,所以如果我有一個愚蠢的錯誤,那就這樣吧。

我在網上發現了一些文章,但他們沒有太多幫助。我已閱讀手冊頁,但我想我沒有足夠的經驗去理解問題所在。一天!感謝您的任何幫助:)

我想有趕上類中的克隆方法:

// -- Header -- // 
namespace _Course_ { 
    class _Homework_ { 
       ... 
     int threadCatch(void *); 
       ... 
    }; 
} 

// -- Source -- // 
namespace _Course_ { 
    void _Homework_::threadTest(void) { 
      ... 
    // From web article 
    void **childStack; 
    childStack = (void **) malloc(KILOBYTE); 
    clone(threadCatch, childStack, CLONE_VM | CLONE_FILES, NULL); 
      ... 
    } 

    int _Homework_::threadCatch(void *){ 
    cout << getpid() << " cloned." << endl;  
    exit(0); 
    } 
} 

是什麼我現在有。我嘗試了不同的方式(將捕手從課程中取出,然後命名空間)。它被編譯了兩次,但是當我嘗試在make clean之後重新編譯時,它告訴我函數(threadCreate)在多個位置聲明。由於這些奇怪的錯誤,我敢肯定我做錯了什麼,而不是對它進行破解,我會採取一些意見。我該怎麼做,或者我應該接下來閱讀什麼?謝謝!

+1

只需在問題編輯器中選擇您的代碼並單擊「{}」按鈕即可獲得自動代碼格式化。不需要通過標記爲粗體或斜體。 – 2011-02-09 20:59:35

+1

混合使用C++類和`clone`聽起來像一個可怕的想法。自己使用clone(而不是`pthread_create`)本身已經是一個足夠糟糕的主意了,除非你正在重新實現pthreads ... – 2011-02-09 21:01:11

+2

從C++類中調用clone()是沒有問題的,函數的指針都是這是必要的。我同意,在製作線程應用程序時,clone()不應該是您的首選,posix線程更好,並且更便於攜帶。也就是說,我懷疑這個教師是從clone()開始的,稍後會移動到pthread。從克隆開始,讓學生了解pthread及其相對於克隆的優勢。 – 2011-02-09 21:10:27

回答

1

將您的catch函數定義爲靜態類函數。

static int threadCatch(void *); 

同時,(你可能不需要這個,但爲了以防萬一,我會在這裏說出來),你可能還需要使用範圍解析運營商將其發送到克隆()。我不這麼認爲,因爲你已經在Homework類中使用它了。但我說這只是爲了以防萬一,它可能會幫助你。

clone(Homework::threadCatch, childStack, CLONE_VM | CLONE_FILES, NULL); 
1

clone(2)系統調用期望指向與C linkage的功能。由於您使用的是C++,我建議將您的threadCatch()函數放入全局名稱空間並聲明它爲extern "C"函數。你也可以在你的類中聲明這個方法爲static,但是我覺得用C鏈接使它成爲一個自由函數可以更好地匹配函數作爲參數傳遞的方式。

如果您需要調用threadCatch()函數內的C++對象,該函數存在於其作用域之外,那麼可以將指針指向arg參數clone()調用。然後,您的threadCatch()函數將會將arg轉換爲適當的類型,以便您可以相應地訪問您的C++對象。

相關問題