關於microwindows中多線程的問題

來源:互聯網
上載者:User
在microwindows的C/S模式中,伺服器和用戶端要進行通訊,如果使用者程式是多線程的話,這時就要考慮很多方面了。1、microwindows是否支援多線程  2、microwindows在多個線程中如何處理顯示的。

首先可以肯定的是,microwindows支援多線程,只是要在配置的時候加上安全執行緒(THREADSAFE)這個選項,就可以使用多線程了。其次,要我看來,microwindows提供的函數無非就是讀伺服器和寫伺服器的函數。對於void GrXXX( )這樣的無傳回型別的函數部分是寫伺服器的,而對於有傳回值的GrXXX()函數則是讀伺服器的函數,要不也就不需要傳回值了。配置的時候加上THREADSAFE這個選項可以保證多個線程在讀寫伺服器的時候能夠得到同步,而不至於你寫一點,我寫一點,這樣也就亂了套了。

GrGetNextEvent這個函數要特別注意,在編寫多線程的時候,我就是在這裡卡住的。GrGetNextEvent函數中,用了一個全域的互斥量來同步,然後等待事件過來,等有事件過來的時候再解鎖。這時問題出現了,如果在前面建立的線程這時要對伺服器端進行寫的操作呢(比如顯示)?通過源碼,我們可以發現,該線程的這種類型的函數會檢測是否全域的互斥量是否可以進行加鎖,如果不能,說明有函數已經加鎖但是還沒有解鎖,這個函數就等待。剛好這裡的情況就是,GrGetNextEvent已經加鎖,而沒有解鎖,所以如果2個線程都會卡在這裡,GrGetNextEvent等待事件的過來,而現實進程則等待GrGetNextEvent或的事件。處理這種情況的方法是,在主線程中,一般就是GrGetNextEvent的那個進程中先用GrRegisterInput函數註冊1個字元描述符。該函數的作用在於,如果註冊了該描述符的檔案有東西被寫入(使用write函數)的時候,就會產生一個GR_EVENT_TYPE_FDINPUT的訊息。回到剛才哪個情景中來,我們可以在2個線程中建立管道,用作註冊的描述符
   
int PipeInitial()
{
    int ret;
   
    unlink("/tmp/abc");
    ret = mkfifo("/tmp/abc", S_IFIFO|0666);
    if (ret == -1)
    {
        PDEBUG("cann't make fifo/n");
        return -1;
    }
    pipe_fd = open("/tmp/abc",  O_RDWR);
   
    GrRegisterInput(pipe_fd);
    return 0;
}
在上面的函數中,建立管道後調用GrRegisterInput註冊了。

把要求顯示的線程的線程裡面的顯示函數放到主線程裡面來,也就是switch中
switch{
     case GR_EVENT_TYPE_FDINPUT:
             顯示的函數;
             pthread_cond_signal(&cond);//通知次線程顯示已經結束。
             break;
        .....
}
當然必要時可以用同步來解決顯示與次線程之間同步的情況。

在次線程中,首先要開啟該管道open(pipe_fd, O_RWONLY)
然後在本來你要求顯示的地方加上
char c = 'c';
write(pipe_fd, c, 1);
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
最後3條語句用來等待顯示結束

這樣就解決了這個問題了。對天長笑幾聲,這幾天為了能順利的儘快的優雅的辭職,我起早貪黑的在寫E-BOOK的代碼,今天終於搞定了,希望明天能拿到辭職證明。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.