最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中的線程信號控制詳解

 更新時間:2023年02月03日 09:02:42   作者:我要出家當(dāng)?shù)朗? 
這篇文章主要通過一些示例為大家詳細(xì)介紹一下C語言中的線程信號控制,文中的示例代碼講解詳細(xì),對我們深入了解C語言有一定的幫助,感興趣的可以學(xué)習(xí)一下

一、場景介紹

存在三個線程,一個主線程和兩個子線程(子線程數(shù)量不固定)。為了節(jié)省頻繁創(chuàng)建銷毀線程造成的資源浪費,將這些線程設(shè)置為常駐線程。但這樣引入了一個新的問題,如何協(xié)調(diào)這些線程完成工作。

主線程內(nèi)是循環(huán)檢測某個文件夾內(nèi)文件的變動,當(dāng)文件夾內(nèi)出現(xiàn)新的文件時,更新可拷貝文件列表,并告知子線程開始干活;子線程拷貝結(jié)束后需要告知主線程任務(wù)完成了,主線程開始下一輪檢測。

二、解決方法

1、臨時線程

主線程每次檢測完畢后,新建子線程執(zhí)行拷貝任務(wù),并阻塞等待線程任務(wù)的結(jié)束。

#include "main.h"
 
void *filecopy_thread(void *args)
{
    pthread_t id = pthread_self();
    PTHREAD_ARGS *thread_args = (PTHREAD_ARGS *)args;
    string dst_dir = thread_args->dst_dir;
    while (1)
    {
        // get the file to copy
        pthread_mutex_lock(thread_args->mutex);
        // exit when the list is empty
        if (thread_args->file_list.empty())
        {
            pthread_mutex_unlock(thread_args->mutex);
            break;
        }
        string src_file = thread_args->file_list.back();
        thread_args->file_list.pop_back();
        pthread_mutex_unlock(thread_args->mutex);
        copy_file(src_file, dst_dir);
    }
    return NULL;
}
 
 
int main(int argc, char **argv)
{
    while(1)
    {
        bool is_switch = oracle.is_redolog_switch();
 
        // judge whether the redolog has bean switched
        if ( is_switch )
        {
            printf("pthread create\n");
            pthread_t *pthread_list = (pthread_t *)malloc(sizeof(pthread_t) * cfg_utils.m_filecopy_pcount);
            if (!pthread_list)
            {
                LOG_F(ERROR, "pthread list created failed");
                continue;
            }
            pthread_mutex_t mutex;
            pthread_mutex_init(&mutex, NULL);
            PTHREAD_ARGS pthread_args = {file_list_src, &mutex, cfg_utils.m_logbk_syspath, &oncebk_count};
            
            struct timeval start, end;
            gettimeofday(&start, NULL);
                        
            // start file copy thread
            for (int i = 0; i < cfg_utils.m_filecopy_pcount; i++)
            {
                 printf("creating pthread(%d)\n", i + 1);
                pthread_create(pthread_list + i, NULL, filecopy_thread, &pthread_args);
            }
            // block until all file has copied
            for (int i = 0; i < cfg_utils.m_filecopy_pcount; i++)
            {
                pthread_join(pthread_list[i], NULL);
            }
            
            gettimeofday(&end, NULL);
            double timeuse = ( end.tv_sec - start.tv_sec ) + (end.tv_usec - start.tv_usec)/1000000.0;
            printf("%.1lf(s)\n", timeuse);
            
            pthread_mutex_destroy(&mutex);
            free(pthread_list);
 
        }
        sleep(cfg_utils.m_bk_cycle);
    }
    return 0;
}

(1)優(yōu)點

邏輯簡單

(2)缺點

頻繁創(chuàng)建與銷毀線程,資源浪費。

2、全局變量信號

定義一個全局變量作為線程的控制信號。

主線程將該信號設(shè)置為子線程的個數(shù)的負(fù)數(shù),以啟動子線程。

當(dāng)該信號小于 0 時,子線程開始啟動。子線程的啟動與任務(wù)完畢都需要將該信號加一。

當(dāng)主線程檢測到該信號為線程總數(shù)時推導(dǎo)子線程本次任務(wù)結(jié)束。

(1)優(yōu)點

子線程作為常駐線程,節(jié)省了一定的資源。

(2)缺點

子線程與主線程在等待信號的過程中要么造成 CPU 的空轉(zhuǎn),要么 sleep 會增加程序的處理時延。

而且,子線程啟動與結(jié)束都對全局信號進(jìn)行加一的操作,極端情況(某些線程執(zhí)行速度存在極端差異)下可能造成信號控制的紊亂。

3、信號量

使用兩組信號:start_signal 和 over_signal。

主線程啟動子線程時,需要將 start_signal 賦值為子線程數(shù),over_signal 賦值為0.

子線程執(zhí)行down(start_signal) ,該操作執(zhí)行成功即可執(zhí)行任務(wù)邏輯,執(zhí)行完后 up(over_signal)。

主線程需要執(zhí)行 num 次down(over_signal)操作,只有所有子線程執(zhí)行結(jié)束,該操作才可以執(zhí)行完成。

在等待執(zhí)行信號down和up的過程中,線程都是阻塞的,不會造成 CPU 的空轉(zhuǎn),當(dāng)信號可操作時也會立即執(zhí)行,不會增加操作時延。

到此這篇關(guān)于C語言中的線程信號控制詳解的文章就介紹到這了,更多相關(guān)C語言線程信號控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之隊列的實現(xiàn)詳解

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之隊列的實現(xiàn)詳解

    隊列只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進(jìn)先出FIFO(First In First Out)的原則。本文將通過實例詳細(xì)說說隊列的實現(xiàn),需要的可以學(xué)習(xí)一下
    2022-10-10
  • C語言實現(xiàn)數(shù)獨游戲的求解

    C語言實現(xiàn)數(shù)獨游戲的求解

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)數(shù)獨游戲的求解,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • C/C++中命名空間(namespace)詳解及其作用介紹

    C/C++中命名空間(namespace)詳解及其作用介紹

    今天小編就為大家分享一篇關(guān)于C++命名空間namespace的介紹與使用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2021-09-09
  • 老生常談C語言中指針的使用

    老生常談C語言中指針的使用

    這篇文章主要為大家詳細(xì)介紹了C語言中指針的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口

    VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口

    這篇文章主要介紹了VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • C++?vector的常見用法超詳細(xì)講解

    C++?vector的常見用法超詳細(xì)講解

    這篇文章主要介紹了C++?vector的常見用法,包括C++中vector容器的定義、初始化方法、訪問元素、常用函數(shù)及其時間復(fù)雜度,通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-04-04
  • C++模板編程特性之移動語義

    C++模板編程特性之移動語義

    首先,移動語義和完美轉(zhuǎn)發(fā)這兩個概念是在C++的模板編程的基礎(chǔ)上,新增的特性,主要是配合模板來使用。本篇會從C++的值類型,到移動拷貝與移動賦值來理解移動語義與完美轉(zhuǎn)發(fā)
    2022-08-08
  • C++string容器基本概念詳解

    C++string容器基本概念詳解

    c++相比c的一個好處就是實現(xiàn)了很多的容器和泛型算法,使得程序員的工作得到了很大的簡化,本文重點給大家介紹C++string容器基本概念講解,需要的朋友參考下吧
    2021-07-07
  • C/C++浮點數(shù)使用的兩個注意事項詳解

    C/C++浮點數(shù)使用的兩個注意事項詳解

    浮點數(shù)都是有符號的,沒有 unsigned 浮點數(shù),下面這篇文章主要給大家介紹了關(guān)于C/C++浮點數(shù)使用的兩個注意事項,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • VC++角色游戲中的人物初始化模塊代碼實例

    VC++角色游戲中的人物初始化模塊代碼實例

    這篇文章主要介紹了VC++角色游戲中的人物初始化模塊,對大家學(xué)習(xí)VC++有一定的幫助,需要的朋友可以參考下
    2014-08-08

最新評論

汕尾市| 富阳市| 奈曼旗| 竹北市| 镇平县| 常德市| 靖远县| 汾西县| 互助| 股票| 南涧| 博乐市| 镇江市| 平江县| 临安市| 西和县| 宁强县| 南溪县| 新乡县| 遂昌县| 马边| 雷山县| 铅山县| 平安县| 韶关市| 栾城县| 波密县| 大新县| 卢龙县| 江达县| 綦江县| 德阳市| 乌鲁木齐市| 光山县| 调兵山市| 天峨县| 乌兰县| 涟源市| 花垣县| 金堂县| 攀枝花市|