{"id":1205,"date":"2019-06-29T10:24:52","date_gmt":"2019-06-29T01:24:52","guid":{"rendered":"https:\/\/www.oji-koji.com\/?p=1205"},"modified":"2021-07-28T10:35:55","modified_gmt":"2021-07-28T01:35:55","slug":"%e3%83%9e%e3%83%ab%e3%83%81%e3%82%b9%e3%83%ac%e3%83%83%e3%83%89%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%80%80%e6%8e%92%e4%bb%96%e5%87%a6%e7%90%86%ef%bc%88%e5%90%8c%e6%9c%9f%e5%88%b6%e5%be%a1","status":"publish","type":"post","link":"https:\/\/www.oji-koji.com\/?p=1205","title":{"rendered":"\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u30d7\u30ed\u30b0\u30e9\u30e0\u3000\u6392\u4ed6\u51e6\u7406(\u540c\u671f\u5236\u5fa1)(2019\/07\/11\u66f4\u65b0)"},"content":{"rendered":"\n<p class=\"program_discription\">\u524d\u56de\u4f5c\u6210\u3057\u305f<a rel=\"noreferrer noopener\" aria-label=\"PrintMAC (\u65b0\u3057\u3044\u30bf\u30d6\u3067\u958b\u304f)\" href=\"https:\/\/www.oji-koji.com\/?p=1152\" target=\"_blank\">PrintMAC<\/a>\u3092\u6b21\u306e\u3088\u3046\u306b\u5909\u66f4\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<br><strong>\u5148\u305a\u306f\u3001Windows\u7248\u304b\u3089\u3084\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/strong><br>  A:1\u79d2\u3054\u3068\u306b50msec\u9593\u9694\u306710\u500b\u8868\u793a<br>  B:2.5\u79d2\u3054\u3068\u306b100msec\u9593\u9694\u30675\u500b\u8868\u793a<br>  C:3.3\u79d2\u3054\u3068\u306b200msec\u9593\u9694\u30674\u500b\u8868\u793a<\/p>\n\n\n\n<p class=\"program_discription\"><strong>timeGetTime()<\/strong>\u3092\u4f7f\u3046\u305f\u3081\u306b<a href=\"https:\/\/www.oji-koji.com\/pro-files\/CommonWin.zip\">stdThead.h, stdThread.cpp<\/a>\u3092\u66f4\u65b0\u3057\u3066\u304f\u3060\u3055\u3044<br><strong>#pragma comment(lib, \u201cWinmm.lib\u201d)<\/strong>\u304c\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u3059 <\/p>\n\n\n\n<p class=\"source_code\">\u3010\u671f\u5f85\u3055\u308c\u308b\u51fa\u529b\u4f8b\u3011\nAAAAAAAAAA\nAAAAAAAAAA\nBBBBB\nAAAAAAAAAA\nCCCC\nAAAAAAAAAA<\/p>\n\n\n\n<p class=\"program_discription\">\u4ee5\u4e0b\u306b\u5909\u66f4\u70b9\u3092\u5217\u6319\u3057\u307e\u3059\u3002<br>1.CMyThread\u306b\u6e21\u3059\u30d1\u30e9\u30e1\u30fc\u30bf\u306b\u6587\u5b57\u9593\u8868\u793a\u9593\u9694\u3001\u8868\u793a\u6587\u5b57\u6570\u3092\u8ffd\u52a0<\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThread.h\u3011\n\/\/ \u5fc5\u8981\u306a\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u69cb\u9020\u4f53\u306b\u3059\u308b\ntypedef struct\n{\n    char    cData;                  \/\/ \u8868\u793a\u3059\u308b\u6587\u5b57\n    DWORD   dwTimer;                \/\/ \u8868\u793a\u9593\u9694(msec)\n    DWORD   dwCharacterInterval;    \/\/ \u6587\u5b57\u9593(msec)\n    int     iNum;                   \/\/ \u8868\u793a\u3059\u308b\u500b\u6570\n} MyDataRec;<\/p>\n\n\n\n<p class=\"program_discription\">2.UINT CMyThread::DoWork()\u3092\u4ed5\u69d8\u306b\u5408\u308f\u305b\u3066\u5909\u66f4<br>  cData\u3092dwTimer(msec)\u3054\u3068\u306bdwCharacterInterval(msec)\u9593\u9694\u3067iNum\u500b\u8868\u793a\u3059\u308b\u3088\u3046\u306b<br>\u5909\u66f4\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\"><strong>\u3010\u30b3\u30e9\u30e0(\u7d4c\u904e\u6642\u9593\u3092\u8abf\u3079\u308b\u95a2\u6570\u3011<\/strong><br><strong>timeGetTime()<\/strong>\u306f32bits\u7b26\u53f7\u306a\u3057\u6574\u6570\u306a\u306e\u3067\u30012^32=49.71\u65e5\u3067\u4e00\u5468\u3057\u3066\u3057\u307e\u3044\u307e\u3059\u3002<br>  \u7d4c\u904e\u6642\u9593\u3092\u6c42\u3081\u308b\u3068\u304d\u306b\u30011\u5468\u3057\u305f\u3068\u304d\u306e\u51e6\u7406\u304c\u5fc5\u8981\u3067\u3059\u3002<br>  \u3053\u3053\u3067\u306fGetdwInterval\u3068\u3044\u3046\u95a2\u6570\u3067\u51e6\u7406\u3057\u3066\u3044\u307e\u3059\u3002<br>  timeGetTime()\u306e\u5206\u89e3\u80fd\u306f\u3001timeBeginPeriod \u3068 timeEndPeriod\u3067\u8a2d\u5b9a\u3057\u307e\u3059\u3002<br>  \u5206\u89e3\u80fd\u306e\u8a2d\u5b9a\u4f8b<br>    timeBeginPeriod(1);           \/\/ \u30bf\u30a4\u30de\u30fc\u306e\u6700\u5c0f\u7cbe\u5ea6\u30921msec\u306b\u3059\u308b<br>    dwNowTime = timeGetTime();<br>    timeEndPeriod(1);             \/\/ \u30bf\u30a4\u30de\u30fc\u306e\u6700\u5c0f\u7cbe\u5ea6\u3092\u623b\u3059<br>\u4ed6\u306bGetTickCount()\u3068\u3044\u3046\u95a2\u6570\u3082\u4f7f\u3048\u307e\u3059\u304c\u3001\u5206\u89e3\u80fd\u306f15msec\u7a0b\u5ea6\u3067\u3059\u3002<br> timeGetTime()\u3088\u308a\u7cbe\u5ea6\u3092\u4e0a\u3052\u305f\u3044\u3068\u304d\u306fQueryPerformanceCounter\u3092\u691c\u8a0e\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThread.cpp\u3011\nUINT CMyThread::DoWork()\n{\n    int        ii;\n    DWORD    dwPrevTime = 0, dwNowTime;            \/\/ \u524d\u56de\u8868\u793a\u3057\u305f\u6642\u523b\u3001\u73fe\u5728\u6642\u523b\n\n    while (!m_fStopFlag)\n    {\n        dwNowTime = timeGetTime();                \/\/ \u73fe\u5728\u6642\u523b(Windows\u306e\u8d77\u52d5\u304b\u3089\u306emsec)\n        \/\/ \u524d\u56de\u306e\u8868\u793a\u6642\u523b\u304b\u3089dwTimer\u7d4c\u904e\u3057\u305f\u304b\n        if (GetdwInterval(dwNowTime, dwPrevTime) &gt;= m_pMyData-&gt;dwTimer)\n        {\n            \/\/ \u6307\u5b9a\u3055\u308c\u305f\u6761\u4ef6\u3067\u6587\u5b57\u3092\u8868\u793a\u3059\u308b\n            for (ii = 0; ii &lt; m_pMyData-&gt;iNum; ++ii)\n            {\n                fprintf(stderr, &#8220;%c&#8221;, m_pMyData-&gt;cData);\n                Sleep(m_pMyData-&gt;dwCharacterInterval);\n            }\n            fprintf(stderr, &#8220;\\n&#8221;);\n            dwPrevTime = dwNowTime;                \/\/ \u8868\u793a\u3057\u305f\u6642\u523b\u3092\u899a\u3048\u308b\n        }\n    }\n    return(1);\n}<\/p>\n\n\n\n<p class=\"program_discription\">3.CMyThread\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u4f5c\u6210\u6642\u306b\u6e21\u3059\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u5909\u66f4 <\/p>\n\n\n\n<p class=\"source_code\">\u3010PrintMAC.cpp\u3011\nint main(int argc, char *argv[])\n{\n    MyDataRec    MyData[3] = { { &#8216;A&#8217;, 1000, 50, 10 }, {&#8216;B&#8217;, 2000, 100, 5}, {&#8216;C&#8217;, 3300, 200, 4} };\n    CMyThread    *pCMyThread[3] = { NULL };\n    int          ii;\n\n    for (ii = 0; ii &lt; 3; ++ii)\n    {\n        pCMyThread[ii] = new CMyThread(&amp;MyData[ii]);    \/\/ \u30d1\u30e9\u30e1\u30fc\u30bf(\u69cb\u9020\u4f53)\u306e\u30dd\u30a4\u30f3\u30bf\u3092\u6e21\u3059\n        pCMyThread[ii]-&gt;Begin();                        \/\/ \u958b\u59cb\n    }\n    getchar();                                          \/\/ Enter\u30ad\u30fc\u5f85\u3061\n\n    for (ii = 0; ii &lt; 3; ++ii)\n        pCMyThread[ii]-&gt;End();                          \/\/ \u30b9\u30ec\u30c3\u30c9\u306b\u7d42\u4e86\u3092\u901a\u77e5\n    for (ii = 0; ii &lt; 3; ++ii)\n    {\n        pCMyThread[ii]-&gt;WaitForEnd();                   \/\/ \u7d42\u4e86\u3059\u308b\u306e\u3092\u5f85\u3064\n        SAFE_DELETE(pCMyThread[ii])                     \/\/ \u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u7834\u68c4\n    }\n    return(0);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u5b9f\u884c\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p class=\"source_code\">C:\\PrintMACN\\x64\\Debug&gt;PrintMAC\nCABAABACBAABAACBAA\n\nC\nAAAAAAAAAA\nABABAABAABAABAA\n\nAAAAAACAAAAC\nCCABABA\nAABABAABAA<\/p>\n\n\n\n<p class=\"program_discription\">\u671f\u5f85\u901a\u308a\u306b\u306a\u3063\u3066\u3044\u307e\u305b\u3093\u3002<br>\u4f55\u304c\u8d77\u3053\u3063\u3066\u3044\u308b\u306e\u3067\u3057\u3087\u3046\u304b\uff1f<br>\u8907\u6570\u306e\u30b9\u30ec\u30c3\u30c9\uff08\u30bf\u30b9\u30af\uff09\u304c\u5171\u901a\u306e\u30ea\u30bd\u30fc\u30b9\u306b\u540c\u6642\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3044\u3046\u4e8b\u614b\u304c<br>\u767a\u751f\u3057\u3066\u3044\u307e\u3059\u3002<br>\u5171\u901a\u306e\u30ea\u30bd\u30fc\u30b9\u3068\u3068\u3044\u3046\u306e\u306f\u3001\u30e1\u30e2\u30ea(\u30b0\u30ed\u30fc\u30d0\u30eb\u306a\u5909\u6570)\u3084\u30d5\u30a1\u30a4\u30eb\u3067\u3059\u3002<br>\u3053\u3053\u3067\u306f\u3001\u6a19\u6e96\u30a8\u30e9\u30fc\u51fa\u529b\u306b\u3001\u540c\u6642\u306b3\u3064\u306e\u30b9\u30ec\u30c3\u30c9\u304c\u66f8\u304d\u8fbc\u307f\u3092\u884c\u3063\u3066\u3044\u307e\u3059\u3002<br>UINT CMyThread::DoWork()\u306eSleep(m_pMyData-&gt;dwCharacterInterval);<br>\u304c\u547c\u3073\u51fa\u3055\u308c\u305f\u3068\u304d\u306b\u3001\u4ed6\u306e\u30b9\u30ec\u30c3\u30c9\u306b\u5b9f\u884c\u304c\u79fb\u3063\u3066\u3044\u307e\u3059\u3002<br>\u5171\u901a\u306e\u30ea\u30bd\u30fc\u30b9\u3078\u306e\u30a2\u30af\u30bb\u30b9\u3092\u76f4\u5217\u5316(\u51e6\u7406\u304c\u7d42\u308f\u308b\u307e\u3067\u4ed6\u306e\u30b9\u30ec\u30c3\u30c9\u306b\u5b9f\u884c\u3055\u305b\u306a\u3044\u3088\u3046\u306b)<br>\u3059\u308b\u306e\u304c\u3001\u540c\u671f\u51e6\u7406\u3067\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\">Windows\u306e\u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u7a2e\u985e\u306b\u306f\u6b21\u306e\u3088\u3046\u306a\u3082\u306e\u304c\u3042\u308a\u307e\u3059\u3002<br>  \u540d\u524d\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u901f\u5ea6\u3000\u30d7\u30ed\u30bb\u30b9\u9593\u540c\u671f\u3000\u30ea\u30bd\u30fc\u30b9\u30ab\u30a6\u30f3\u30c8\u6a5f\u80fd<br>  <strong>\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3<\/strong>\u3000\u9ad8\u3000\u3000\u306a\u3057\u3000\u3000\u3000\u3000\u3000\u3000\u306a\u3057\uff08\u6392\u4ed6\u30a2\u30af\u30bb\u30b9\uff09<br>  <strong>\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9<\/strong>\u3000\u3000\u3000\u3000\u3000\u4f4e\u3000\u3000\u3042\u308a\u3000\u3000\u3000\u3000\u3000\u3000\u306a\u3057\uff08\u6392\u4ed6\u30a2\u30af\u30bb\u30b9\uff09<br>  \u30bb\u30de\u30d5\u30a9\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u4f4e\u3000\u3000\u3042\u308a\u3000\u3000\u3000\u3000\u3000\u3000\u3042\u308a                <br>  \u30a4\u30d9\u30f3\u30c8\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u4f4e\u3000\u3000\u3042\u308a\u3000\u3000\u3000\u3000\u3000\u3000\u3042\u308a                <br>  \u30e1\u30fc\u30bf\u30fc\u30c9\u30bb\u30af\u30b7\u30e7\u30f3\u3000\u3000\u9ad8\u3000\u3000\u3042\u308a\u3000\u3000\u3000\u3000\u3000\u3000\u3042\u308a                <br>\u3053\u3053\u3067\u306f\u3001\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u3068\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u3092\u4f7f\u3063\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\">1.\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\uff1a<strong>PrintMACCriticalSection<\/strong><br>2.\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\uff1a<strong>PrintMACMutex<\/strong><br>PrintMAC\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3001\u30d5\u30a9\u30eb\u30c0\u540d\u3001\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u540d\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u3092<br>\u5909\u66f4\u3092\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><a href=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/Critical_Mutex.png\" data-rel=\"lightbox-gallery-N6iK67WN\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/Critical_Mutex-1024x299.png\" alt=\"\" class=\"wp-image-1241\" width=\"768\" height=\"224\" srcset=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/Critical_Mutex-1024x299.png 1024w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/Critical_Mutex-300x88.png 300w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/Critical_Mutex-768x224.png 768w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/Critical_Mutex.png 1971w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><\/figure>\n\n\n\n<p class=\"program_discription\"><strong>\u6700\u521d\u306b\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u4f7f\u3063\u3066\u307f\u307e\u3059<\/strong>\u3002<br>  \u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u6240\u6709\u3057\u3066\u3044\u308b\u30b9\u30ec\u30c3\u30c9\u306e\u307f\u304c\u5b9f\u884c\u53ef\u80fd\u306b\u306a\u308b\u4ed5\u7d44\u307f\u3067\u3059\u3002<br>  CMyThread\u306b\u6e21\u3059\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u69cb\u9020\u4f53\u306e\u30e1\u30f3\u30d0\u306b<strong>CRITICAL_SECTION<\/strong>\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThread.h\u3011\ntypedef struct\n{\n    char    cData;                  \/\/ \u8868\u793a\u3059\u308b\u6587\u5b57\n    DWORD   dwTimer;                \/\/ \u8868\u793a\u9593\u9694(msec)\n    DWORD   dwCharacterInterval;    \/\/ \u6587\u5b57\u9593(msec)\n    int     iNum;                   \/\/ \u8868\u793a\u3059\u308b\u500b\u6570\n    CRITICAL_SECTION    *pcs;       \/\/ \u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\n} MyDataRec;<\/p>\n\n\n\n<p class=\"program_discription\">\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u306eAPI<br>  <strong>VOID InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection);<\/strong><br>    \u6307\u5b9a\u3055\u308c\u305f\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u521d\u671f\u5316\u3057\u307e\u3059<br>  <strong>VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);<\/strong><br>    \u6240\u6709\u3055\u308c\u3066\u3044\u306a\u3044\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u6307\u5b9a\u3057\u3001<br>    \u305d\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u4f7f\u3063\u3066\u3044\u308b\u3059\u3079\u3066\u306e\u30ea\u30bd\u30fc\u30b9\u3092\u89e3\u653e\u3057\u307e\u3059\u3002<br>  <strong>VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);<\/strong><br>    \u6307\u5b9a\u3055\u308c\u305f\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u6240\u6709\u6a29\u3092\u53d6\u5f97\u3059\u308b\u307e\u3067\u5f85\u6a5f\u3057\u307e\u3059\u3002<br>  <strong>VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);<\/strong><br>    \u6307\u5b9a\u3055\u308c\u305f\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u6240\u6709\u6a29\u3092\u89e3\u653e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\">\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u521d\u671f\u5316\u3057\u3001\u5404\u30b9\u30ec\u30c3\u30c9\u306b\u6e21\u3057\u3001\u4f7f\u7528\u5f8c\u958b\u653e\u3059\u308b\u51e6\u7406\u3067\u3059\u3002<br>\u5909\u66f4\u7b87\u6240\u306b\u306f\u2605\u3092\u4ed8\u3051\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010PrintMAC.cpp\u3011\nint main(int argc, char *argv[])\n{\n    MyDataRec    MyData[3] = { { &#8216;A&#8217;, 1000, 50, 10 }, {&#8216;B&#8217;, 2000, 100, 5}, {&#8216;C&#8217;, 3300, 200, 4} };\n    CMyThread    *pCMyThread[3] = { NULL };\n    int            ii;\n    CRITICAL_SECTION    cs;                             \/\/ \u2605\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\n\n    InitializeCriticalSection(&amp;cs);                     \/\/ \u2605\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u521d\u671f\u5316\n    for (ii = 0; ii &lt; 3; ++ii)                          \/\/ \u2605\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u30d1\u30e9\u30e1\u30fc\u30bf\u306b\u30bb\u30c3\u30c8\n        MyData[ii].pcs = &amp;cs;\n\n    for (ii = 0; ii &lt; 3; ++ii)\n    {\n        pCMyThread[ii] = new CMyThread(&amp;MyData[ii]);    \/\/ \u30d1\u30e9\u30e1\u30fc\u30bf(\u69cb\u9020\u4f53)\u306e\u30dd\u30a4\u30f3\u30bf\u3092\u6e21\u3059\n        pCMyThread[ii]-&gt;Begin();                        \/\/ \u958b\u59cb\n    }\n    getchar();                                          \/\/ Enter\u30ad\u30fc\u5f85\u3061\n\n    for (ii = 0; ii &lt; 3; ++ii)\n        pCMyThread[ii]-&gt;End();                          \/\/ \u30b9\u30ec\u30c3\u30c9\u306b\u7d42\u4e86\u3092\u901a\u77e5\n    for (ii = 0; ii &lt; 3; ++ii)\n    {\n        pCMyThread[ii]-&gt;WaitForEnd();                   \/\/ \u7d42\u4e86\u3059\u308b\u306e\u3092\u5f85\u3064\n        SAFE_DELETE(pCMyThread[ii])                     \/\/ \u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u7834\u68c4\n    }\n    DeleteCriticalSection(&amp;cs);                         \/\/ \u2605\u30af\u30ea\u30c6\u30a3\u30ab\u30eb\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u958b\u653e\n    return(0);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u5404\u30b9\u30ec\u30c3\u30c9\u304c\u5b9f\u884c\u3059\u308b\u95a2\u6570\u306b\u540c\u671f\u51e6\u7406\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<br>\u5909\u66f4\u7b87\u6240\u306b\u306f\u2605\u3092\u4ed8\u3051\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThrtead.cpp\u3011\nUINT CMyThread::DoWork()\n{\n    int        ii;\n    DWORD    dwPrevTime = 0, dwNowTime;                \/\/ \u524d\u56de\u8868\u793a\u3057\u305f\u6642\u523b\u3001\u73fe\u5728\u6642\u523b\n\n    while (!m_fStopFlag)\n    {\n        dwNowTime = timeGetTime();                    \/\/ \u73fe\u5728\u6642\u523b(Windows\u306e\u8d77\u52d5\u304b\u3089\u306emsec)\n        \/\/ \u524d\u56de\u306e\u8868\u793a\u6642\u523b\u304b\u3089dwTimer\u7d4c\u904e\u3057\u305f\u304b\n        if (GetdwInterval(dwNowTime, dwPrevTime) &gt;= m_pMyData-&gt;dwTimer)\n        {\n            EnterCriticalSection(m_pMyData-&gt;pcs);    \/\/ \u2605\u6240\u6709\u6a29\u3092\u53d6\u5f97\u3059\u308b\u307e\u3067\u5f85\u3064\n            \/\/ \u6307\u5b9a\u3055\u308c\u305f\u6761\u4ef6\u3067\u6587\u5b57\u3092\u8868\u793a\u3059\u308b\n            for (ii = 0; ii &lt; m_pMyData-&gt;iNum; ++ii)\n            {\n                fprintf(stderr, &#8220;%c&#8221;, m_pMyData-&gt;cData);\n                Sleep(m_pMyData-&gt;dwCharacterInterval);\n            }\n            fprintf(stderr, &#8220;\\n&#8221;);\n            LeaveCriticalSection(m_pMyData-&gt;pcs);    \/\/ \u2605\u6240\u6709\u6a29\u3092\u958b\u653e\u3059\u308b\n            dwPrevTime = dwNowTime;                  \/\/ \u8868\u793a\u3057\u305f\u6642\u523b\u3092\u899a\u3048\u308b\n        }\n    }\n    return(1);\n}<\/p>\n\n\n\n<p>\u3053\u308c\u3067\u5b8c\u6210\u3067\u3059\u3002<br>\u671f\u5f85\u901a\u308a\u306e\u52d5\u4f5c\u3092\u3057\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p class=\"source_code\">C:\\PrintMACNCriticalSection\\x64\\Debug&gt;PrintMACCriticalSection.exe\nBBBBB\nAAAAAAAAAA\nAAAAAAAAAA\nCCCC\nBBBBB\nAAAAAAAAAA\nCCCC\nAA<\/p>\n\n\n\n<p class=\"program_discription\"><strong>\u6b21\u306b\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u3092\u4f7f\u3063\u3066\u307f\u307e\u3059\u3002<\/strong><br>\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u306eAPI<br><strong>HANDLE CreateMutex(<br>  LPSECURITY_ATTRIBUTES lpMutexAttributes,  \/\/ \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a18\u8ff0\u5b50<br>  BOOL bInitialOwner,                       \/\/ \u6700\u521d\u306e\u6240\u6709\u8005<br>  LPCTSTR lpName                            \/\/ \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u540d\u524d<br>  );<\/strong><br> \u540d\u524d\u4ed8\u304d\u307e\u305f\u306f\u540d\u524d\u306a\u3057\u306e\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u307e\u305f\u306f\u958b\u304d\u307e\u3059\u3002 <br>    \u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u8a18\u8ff0\u5b50\uff1aNULL\u3092\u6307\u5b9a<br>    \u6700\u521d\u306e\u6240\u6709\u8005\uff1aFALSE\u3092\u6307\u5b9a\uff08\u6240\u6709\u8005\u306a\u3057\uff09<br>    \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u540d\u524d\uff1aNULL\u3092\u6307\u5b9a\uff08\u540d\u524d\u3092\u6307\u5b9a\u3059\u308b\u3068\u3001\u30d7\u30ed\u30bb\u30b9\u3092\u6e21\u3063\u3066<br>      \u6709\u52b9\u306a\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u304c\u3067\u304d\u308b\uff09<br><strong>DWORD WaitForSingleObject(HANDLE hMutex, INFINITE);<\/strong><br>  \u6240\u6709\u6a29\u3092\u53d6\u5f97\u3059\u308b\u307e\u3067\u5f85\u3061\u7d9a\u3051\u308b<br><strong>BOOL ReleaseMutex(HANDLE hMutex);<\/strong><br>  \u6307\u5b9a\u3055\u308c\u305f\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u6240\u6709\u6a29\u3092\u89e3\u653e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\">CMyThread\u306b\u6e21\u3059\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u69cb\u9020\u4f53\u306e\u30e1\u30f3\u30d0\u306b<strong>\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u306e\u30cf\u30f3\u30c9\u30eb<\/strong>\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThread.h\u3011\ntypedef struct\n{\n    char    cData;                \/\/ \u8868\u793a\u3059\u308b\u6587\u5b57\n    DWORD   dwTimer;              \/\/ \u8868\u793a\u9593\u9694(msec)\n    DWORD    dwCharacterInterval; \/\/ \u6587\u5b57\u9593(msec)\n    int        iNum;              \/\/ \u8868\u793a\u3059\u308b\u500b\u6570\n    HANDLE    *phMutex;           \/\/ \u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\n} MyDataRec;<\/p>\n\n\n\n<p class=\"program_discription\">\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u3092\u4f5c\u6210\u3057\u3001\u5404\u30b9\u30ec\u30c3\u30c9\u306b\u6e21\u3057\u3001\u4f7f\u7528\u5f8c\u7834\u68c4\u3059\u308b\u51e6\u7406\u3067\u3059\u3002<br>\u5909\u66f4\u7b87\u6240\u306b\u306f\u2605\u3092\u4ed8\u3051\u307e\u3057\u305f<\/p>\n\n\n\n<p class=\"source_code\">\u3010PrintMAC.cpp\u3011\nint main(int argc, char *argv[])\n{\n    MyDataRec    MyData[3] = { { &#8216;A&#8217;, 1000, 50, 10 }, {&#8216;B&#8217;, 2000, 100, 5}, {&#8216;C&#8217;, 3300, 200, 4} };\n    CMyThread    *pCMyThread[3] = { NULL };\n    int          ii;\n    HANDLE       hMutex;                              \/\/ \u2605\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u306e\u30cf\u30f3\u30c9\u30eb\n\n    hMutex = CreateMutex(NULL, FALSE, NULL);          \/\/ \u2605\u6240\u6709\u8005\u306e\u306a\u3044\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u306e\u4f5c\u6210        \n    for (ii = 0; ii &lt; 3; ++ii)                        \/\/ \u2605\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u306e\u30cf\u30f3\u30c9\u30eb\u3092\u30d1\u30e9\u30e1\u30fc\u30bf\u306b\u30bb\u30c3\u30c8\n        MyData[ii].phMutex = &amp;hMutex;\n\n    for (ii = 0; ii &lt; 3; ++ii)\n    {\n        pCMyThread[ii] = new CMyThread(&amp;MyData[ii]);  \/\/ \u30d1\u30e9\u30e1\u30fc\u30bf(\u69cb\u9020\u4f53)\u306e\u30dd\u30a4\u30f3\u30bf\u3092\u6e21\u3059\n        pCMyThread[ii]-&gt;Begin();                      \/\/ \u958b\u59cb\n    }\n    getchar();                                        \/\/ Enter\u30ad\u30fc\u5f85\u3061\n\n    for (ii = 0; ii &lt; 3; ++ii)\n        pCMyThread[ii]-&gt;End();                        \/\/ \u30b9\u30ec\u30c3\u30c9\u306b\u7d42\u4e86\u3092\u901a\u77e5\n    for (ii = 0; ii &lt; 3; ++ii)\n    {\n        pCMyThread[ii]-&gt;WaitForEnd();                 \/\/ \u7d42\u4e86\u3059\u308b\u306e\u3092\u5f85\u3064\n        SAFE_DELETE(pCMyThread[ii])                   \/\/ \u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u7834\u68c4\n    }\n    CloseHandle(hMutex);                              \/\/ \u2605\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u306e\u7834\u68c4\n    return(0);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u5404\u30b9\u30ec\u30c3\u30c9\u304c\u5b9f\u884c\u3059\u308b\u95a2\u6570\u306b\u540c\u671f\u51e6\u7406\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<br>\u5909\u66f4\u7b87\u6240\u306b\u306f\u2605\u3092\u4ed8\u3051\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThread.cpp\u3011\nUINT CMyThread::DoWork()\n{\n    int      ii;\n    DWORD    dwPrevTime = 0, dwNowTime;        \/\/ \u524d\u56de\u8868\u793a\u3057\u305f\u6642\u523b\u3001\u73fe\u5728\u6642\u523b\n\n    while (!m_fStopFlag)\n    {\n        dwNowTime = timeGetTime();            \/\/ \u73fe\u5728\u6642\u523b(Windows\u306e\u8d77\u52d5\u304b\u3089\u306emsec)\n        \/\/ \u524d\u56de\u306e\u8868\u793a\u6642\u523b\u304b\u3089dwTimer\u7d4c\u904e\u3057\u305f\u304b\n        if (GetdwInterval(dwNowTime, dwPrevTime) &gt;= m_pMyData-&gt;dwTimer)\n        {\n            WaitForSingleObject(*(m_pMyData-&gt;phMutex), INFINITE);   \/\/ \u2605\u6240\u6709\u6a29\u3092\u53d6\u5f97\u3059\u308b\u307e\u3067\u5f85\u3061\u7d9a\u3051\u308b\n            \/\/ \u6307\u5b9a\u3055\u308c\u305f\u6761\u4ef6\u3067\u6587\u5b57\u3092\u8868\u793a\u3059\u308b\n            for (ii = 0; ii &lt; m_pMyData-&gt;iNum; ++ii)\n            {\n                fprintf(stderr, &#8220;%c&#8221;, m_pMyData-&gt;cData);\n                Sleep(m_pMyData-&gt;dwCharacterInterval);\n            }\n            fprintf(stderr, &#8220;\\n&#8221;);\n            ReleaseMutex(*(m_pMyData-&gt;phMutex));                    \/\/ \u2605\u6240\u6709\u6a29\u3092\u89e3\u653e\n            dwPrevTime = dwNowTime;                                 \/\/ \u8868\u793a\u3057\u305f\u6642\u523b\u3092\u899a\u3048\u308b\n        }\n    }\n    return(1);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u3053\u308c\u3067\u5b8c\u6210\u3067\u3059\u3002<br>\u671f\u5f85\u901a\u308a\u306e\u52d5\u4f5c\u3092\u3057\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p class=\"program_discription\"><strong>Linux\u7248\u3092\u3084\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/strong><br>Windows\u306e\u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306e\u7a2e\u985e\u306b\u306f\u6b21\u306e\u3088\u3046\u306a\u3082\u306e\u304c\u3042\u308a\u307e\u3059\u3002<br>  \u540d\u524d<br>  <strong>\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9<\/strong><br>  \u30bb\u30de\u30d5\u30a9<br>\u3053\u3053\u3067\u306f\u3001\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u3092\u4f7f\u3063\u3066\u307f\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"program_discription\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\uff1a<strong>PrintMACMutex<\/strong><br>PrintMAC\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3001\u30d5\u30a9\u30eb\u30c0\u540d\u3001\u30bd\u30ea\u30e5\u30fc\u30b7\u30e7\u30f3\u540d\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d\u3001makefile<br>\u306e\u5909\u66f4\u3092\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><a href=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/MutexLinux.png\" data-rel=\"lightbox-gallery-N6iK67WN\" data-rl_title=\"\" data-rl_caption=\"\" title=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/MutexLinux-1024x351.png\" alt=\"\" class=\"wp-image-1274\" width=\"768\" height=\"263\" srcset=\"https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/MutexLinux-1024x351.png 1024w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/MutexLinux-300x103.png 300w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/MutexLinux-768x263.png 768w, https:\/\/www.oji-koji.com\/wp-content\/uploads\/2019\/06\/MutexLinux.png 2024w\" sizes=\"auto, (max-width: 768px) 100vw, 768px\" \/><\/a><\/figure>\n\n\n\n<p class=\"program_discription\">Linux\u306emutex\u3092\u53d6\u308a\u6271\u3046\u305f\u3081\u306eAPI<br><strong>int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr);<\/strong><br>  mutex \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u3001 mutexattr \u3067\u6307\u5b9a\u3055\u308c\u305f mutex \u5c5e\u6027\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b<br>  \u5f93\u3063\u3066\u521d\u671f\u5316\u3059\u308b\u3002 mutexattr \u304c NULL, \u306a\u3089\u3070\u3001\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u5c5e\u6027\u304c\u4f7f\u308f\u308c\u308b\u3002<br>  \u5e38\u306b 0 \u3092\u8fd4\u3059<br><strong>int pthread_mutex_destroy(pthread_mutex_t *mutex);<\/strong><br>  mutex \u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u7834\u58ca\u3057\u3001\u305d\u308c\u304c\u4fdd\u6301\u3057\u3066\u3044\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u8cc7\u6e90\u3092<br>  \u958b\u653e\u3059\u308b\u3002mutex \u306f\u95a2\u6570\u306e\u958b\u59cb\u6642\u70b9\u3067\u30a2\u30f3\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u306a\u3051\u308c\u3070\u306a\u3089\u306a\u3044\u3002<br>  \u6210\u529f\u3059\u308c\u3070 0 \u3092\u8fd4\u3057\u3001 \u30a8\u30e9\u30fc\u3067\u306f\u975e\u30bc\u30ed\u306e\u30a8\u30e9\u30fc\u30b3\u30fc\u30c9\u3092\u8fd4\u3059<br><strong>int pthread_mutex_lock(pthread_mutex_t *mutex);<\/strong><br>  \u6307\u5b9a\u3057\u305fmutex\u3092\u30ed\u30c3\u30af\u3059\u308b\u3002<br>  mutex \u304c\u73fe\u5728\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u306a\u3051\u308c\u3070\u3001 \u305d\u308c\u306f\u30ed\u30c3\u30af\u3055\u308c\u3001\u547c\u3073\u51fa\u3057\u30b9\u30ec\u30c3\u30c9\u306b<br>  \u3088\u3063\u3066\u6240\u6709\u3055\u308c\u308b\u3002\u3053\u306e\u5834\u5408 pthread_mutex_lock \u306f\u76f4\u3061\u306b\u8fd4\u308b\u3002<br>  mutex \u304c\u4ed6\u306e\u30b9\u30ec\u30c3\u30c9\u306b\u3088\u3063\u3066\u65e2\u306b\u30ed\u30c3\u30af\u3055\u308c\u3066\u3044\u305f\u306e\u306a\u3089\u3070\u3001 pthread_mutex_lock\u306f<br>  mutex \u304c\u30a2\u30f3\u30ed\u30c3\u30af\u3055\u308c\u308b\u307e\u3067\u547c\u3073\u51fa\u3057\u30b9\u30ec\u30c3\u30c9\u306e\u5b9f\u884c\u3092\u505c\u6b62\u3055\u305b\u308b\u3002 <br>  \u6210\u529f\u3059\u308c\u3070 0 \u3092\u8fd4\u3057\u3001 \u30a8\u30e9\u30fc\u3067\u306f\u975e\u30bc\u30ed\u306e\u30a8\u30e9\u30fc\u30b3\u30fc\u30c9\u3092\u8fd4\u3059<br><strong>int pthread_mutex_unlock(pthread_mutex_t *mutex);<\/strong><br>  \u6307\u5b9a\u3057\u305fmutex\u3092\u30a2\u30f3\u30ed\u30c3\u30af\u3059\u308b\u3002<br>  \u6210\u529f\u3059\u308c\u3070 0 \u3092\u8fd4\u3057\u3001 \u30a8\u30e9\u30fc\u3067\u306f\u975e\u30bc\u30ed\u306e\u30a8\u30e9\u30fc\u30b3\u30fc\u30c9\u3092\u8fd4\u3059<\/p>\n\n\n\n<p class=\"program_discription\">CMyThread\u306b\u6e21\u3059\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\u69cb\u9020\u4f53\u306e\u30e1\u30f3\u30d0\u306b<strong>pthread_mutex_t<\/strong>\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThread.h\u3011\ntypedef struct\n{\n    char    cData;               \/\/ \u8868\u793a\u3059\u308b\u6587\u5b57\n    DWORD   dwTimer;             \/\/ \u8868\u793a\u9593\u9694(msec)\n    DWORD   dwCharacterInterval; \/\/ \u6587\u5b57\u9593(msec)\n    int     iNum;                \/\/ \u8868\u793a\u3059\u308b\u500b\u6570\n    pthread_mutex_t  *pmutex;    \/\/ \u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\n} MyDataRec;<\/p>\n\n\n\n<p class=\"program_discription\">\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u3092\u521d\u671f\u5316\u3057\u3001\u5404\u30b9\u30ec\u30c3\u30c9\u306b\u6e21\u3057\u3001\u4f7f\u7528\u5f8c\u7834\u68c4\u3059\u308b\u51e6\u7406\u3067\u3059\u3002<br>\u5909\u66f4\u7b87\u6240\u306b\u306f\u2605\u3092\u4ed8\u3051\u307e\u3057\u305f<\/p>\n\n\n\n<p class=\"source_code\">\u3010PrintMAC.cpp\u3011\nint main(int argc, char *argv[])\n{\n    MyDataRec    MyData[3] = { { &#8216;A&#8217;, 1000, 50, 10 }, {&#8216;B&#8217;, 2000, 100, 5}, {&#8216;C&#8217;, 3300, 200, 4} };\n    CMyThread    *pCMyThread[3] = { NULL };\n    int          ii;\n    pthread_mutex_t    mutex;                          \/\/ \u2605\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\n\n    pthread_mutex_init(&amp;mutex, NULL);                  \/\/ \u2605\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u306e\u521d\u671f\u5316\n    for (ii = 0; ii &lt; 3; ++ii)\n        MyData[ii].pmutex = &amp;mutex;\n\n    for (ii = 0; ii &lt; 3; ++ii)\n    {\n        pCMyThread[ii] = new CMyThread(&amp;MyData[ii]);    \/\/ \u30d1\u30e9\u30e1\u30fc\u30bf(\u69cb\u9020\u4f53)\u306e\u30dd\u30a4\u30f3\u30bf\u3092\u6e21\u3059\n        pCMyThread[ii]-&gt;Begin();                        \/\/ \u958b\u59cb\n    }\n    getchar();                                          \/\/ Enter\u30ad\u30fc\u5f85\u3061\n\n    for (ii = 0; ii &lt; 3; ++ii)\n        pCMyThread[ii]-&gt;End();                          \/\/ \u30b9\u30ec\u30c3\u30c9\u306b\u7d42\u4e86\u3092\u901a\u77e5\n    for (ii = 0; ii &lt; 3; ++ii)\n    {\n        pCMyThread[ii]-&gt;WaitForEnd();                    \/\/ \u7d42\u4e86\u3059\u308b\u306e\u3092\u5f85\u3064\n        SAFE_DELETE(pCMyThread[ii])                      \/\/ \u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u7834\u68c4\n    }\n    pthread_mutex_destroy(&amp;mutex);                       \/\/ \u2605\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u306e\u7834\u68c4\n    return(0);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u5404\u30b9\u30ec\u30c3\u30c9\u304c\u5b9f\u884c\u3059\u308b\u95a2\u6570\u306b\u540c\u671f\u51e6\u7406\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<br>\u5909\u66f4\u7b87\u6240\u306b\u306f\u2605\u3092\u4ed8\u3051\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p class=\"source_code\">\u3010MyThread.cpp\u3011\nUINT CMyThread::DoWork()\n{\n    int        ii;\n    DWORD    dwPrevTime = 0, dwNowTime;\n\n    while (!m_fStopFlag)\n    {\n        dwNowTime = timeGetTime();\n        if (GetdwInterval(dwNowTime, dwPrevTime) &gt;= m_pMyData-&gt;dwTimer)\n        {\n            pthread_mutex_lock(m_pMyData-&gt;pmutex);             \/\/ \u2605\u6240\u6709\u6a29\u3092\u53d6\u5f97\u3059\u308b\u307e\u3067\u5f85\u3064\n            for (ii = 0; ii &lt; m_pMyData-&gt;iNum; ++ii)\n            {\n                fprintf(stderr, &#8220;%c&#8221;, m_pMyData-&gt;cData);\n                usleep(m_pMyData-&gt;dwCharacterInterval * 1000);\n            }\n            fprintf(stderr, &#8220;\\n&#8221;);\n            pthread_mutex_unlock(m_pMyData-&gt;pmutex);          \/\/ \u2605\u6240\u6709\u6a29\u3092\u958b\u653e\u3059\u308b\n            dwPrevTime = dwNowTime;\n        }\n    }\n    return(1);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u3053\u308c\u3067\u5b8c\u6210\u3067\u3059\u3002<br>\u671f\u5f85\u901a\u308a\u306e\u52d5\u4f5c\u3092\u3057\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<p class=\"source_code\">pi@shimodaPi1:~\/PrintMACMutex $ .\/PrintMACMutex\nAAAAAAAAAA\nBBBBB\nCCCC\nAAAAAAAAAA\nAAAAAAAAAA\nBBBBB\nCCCC\nAAAAAAAAAA\nAAAAAAAAAA\nBBBBB\nAAAAAAAA<\/p>\n\n\n\n<p class=\"program_discription\">\u5b8c\u6210\u3057\u305f\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u6b21\u306e\u3088\u3046\u306b\u5909\u66f4\u3057\u3066\u52d5\u4f5c\u3092\u78ba\u8a8d\u3057\u3066\u307f\u3066\u304f\u3060\u3055\u3044<br>  A:1\u79d2\u3054\u3068\u306b50msec\u9593\u9694\u306725\u500b\u8868\u793a<br>  B:2.5\u79d2\u3054\u3068\u306b100msec\u9593\u9694\u30675\u500b\u8868\u793a<br>  C:3.3\u79d2\u3054\u3068\u306b200msec\u9593\u9694\u30674\u500b\u8868\u793a<br>CMyThread\u306b\u6e21\u3059\u30d1\u30e9\u30e1\u30fc\u30bf\u306e\uff11\u304b\u6240\u3092\u5909\u66f4\u3059\u308b\u3060\u3051\u3067\u3059\u3002<br>MyDataRec    MyData[3] = { { &#8216;A&#8217;, 1000, 50, <strong>25<\/strong> }, {&#8216;B&#8217;, 2000, 100, 5}, {&#8216;C&#8217;, 3300, 200, 4} };<br>\u3069\u3046\u306a\u308a\u307e\u3057\u305f\u304b\u3002<\/p>\n\n\n\n<p class=\"source_code\">pi@shimodaPi1:~\/PrintMACMutex $ .\/PrintMACMutex\nAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAAAA\nAAAAAAAAAAAAAAAAAAAAAAA\nAA                            \u2190\u3053\u3053\u3067ENTER\u30ad\u30fc\u3092\u62bc\u3057\u307e\u3057\u305f\u3002\nCThreadFunc End\nCCC\nThreadFunc End\nBBBBB\nThreadFunc End<\/p>\n\n\n\n<p class=\"program_discription\">A\u3057\u304b\u8868\u793a\u3057\u3066\u3044\u307e\u305b\u3093\u3002<br>ENTER\u30ad\u30fc\u3092\u62bc\u3059\u3068\u3001B\u3084C\u304c\u8868\u793a\u3055\u308c\u308b\u306e\u3067\u3001\u30b9\u30ec\u30c3\u30c9\u306f\u3061\u3083\u3093\u3068\u52d5\u3044\u3066\u3044\u305f\u3088\u3046\u3067\u3059\u3002<br>\u8868\u793a\u3059\u308b\u95a2\u6570\u3092\u3082\u3046\u4e00\u5ea6\u307f\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<p class=\"source_code\">UINT CMyThread::DoWork()\n{\n    int        ii;\n    DWORD    dwPrevTime = 0, dwNowTime;\n\n    while (!m_fStopFlag)\n    {\n        dwNowTime = timeGetTime();\n        if (GetdwInterval(dwNowTime, dwPrevTime) &gt;= m_pMyData-&gt;dwTimer)\n        {\n            pthread_mutex_lock(m_pMyData-&gt;pmutex);        \/\/ \u2460\u6240\u6709\u6a29\u3092\u53d6\u5f97\u3059\u308b\u307e\u3067\u5f85\u3064\n            for (ii = 0; ii &lt; m_pMyData-&gt;iNum; ++ii)\n            {\n                fprintf(stderr, &#8220;%c&#8221;, m_pMyData-&gt;cData);\n                usleep(m_pMyData-&gt;dwCharacterInterval * 1000);\n            }\n            fprintf(stderr, &#8220;\\n&#8221;);\n            pthread_mutex_unlock(m_pMyData-&gt;pmutex);     \/\/ \u2461\u6240\u6709\u6a29\u3092\u958b\u653e\u3059\u308b\n            dwPrevTime = dwNowTime;\n        }\n    }\n    return(1);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u2460\u3067\u30df\u30e5\u30fc\u30c6\u30c3\u30af\u30b9\u306e\u6240\u6709\u6a29\u3092\u7372\u5f97\u3057\u3066\u2461\u3067\u958b\u653e\u3057\u307e\u3059\u3002<br>\u2461\u3092\u5b9f\u65bd\u5f8c\u2460\u304c\u5b9f\u65bd\u3055\u308c\u308b\u307e\u3067\u306b\u3001\u4ed6\u306e\u30b9\u30ec\u30c3\u30c9\u304c\u6240\u6709\u6a29\u3092\u7372\u5f97\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<br>{ &#8216;A&#8217;, 1000, 50, 25 }\u3068\u3044\u3046\u6761\u4ef6\u3067\u5b9f\u65bd\u3059\u308b\u3068<br>\u2460-\u2461\u3067\u300150*25=1250msec\u30671000msec\u3092\u304a\u8d85\u3048\u3066\u3044\u308b\u306e\u3067\u3001\u2461-\u2460\u306e\u9593\u304c\u306a\u304f\u3059\u3050\u306b\u2460<br>\u304c\u5b9f\u65bd\u3055\u308c\u3066\u3057\u307e\u3044\u307e\u3059\u3002<br>\u305d\u306e\u305f\u3081\u3001\u4ed6\u306e\u30b9\u30ec\u30c3\u30c9\u304c\u6240\u6709\u6a29\u3092\u7372\u5f97\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u306a\u3044\u3068\u3044\u3046\u4e8b\u614b\u304c\u8d77\u3053\u3063\u3066\u3044\u307e\u3059\u3002<br>\u3053\u308c\u3092\u56de\u907f\u3059\u308b\u306b\u306f\u2461\u306b\u3059\u3050\u5f8c\u306busleep(0);\u3092\u66f8\u3044\u3066\u4ed6\u306e\u30b9\u30ec\u30c3\u30c9\u306b\u5b9f\u884c\u306e\u30c1\u30e3\u30f3\u30b9\u3092<br>\u4e0e\u3048\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">UINT CMyThread::DoWork()\n{\n    int        ii;\n    DWORD    dwPrevTime = 0, dwNowTime;\n\n    while (!m_fStopFlag)\n    {\n        dwNowTime = timeGetTime();\n        if (GetdwInterval(dwNowTime, dwPrevTime) &gt;= m_pMyData-&gt;dwTimer)\n        {\n            pthread_mutex_lock(m_pMyData-&gt;pmutex);        \/\/ \u2460\u6240\u6709\u6a29\u3092\u53d6\u5f97\u3059\u308b\u307e\u3067\u5f85\u3064\n            for (ii = 0; ii &lt; m_pMyData-&gt;iNum; ++ii)\n            {\n                fprintf(stderr, &#8220;%c&#8221;, m_pMyData-&gt;cData);\n                usleep(m_pMyData-&gt;dwCharacterInterval * 1000);\n            }\n            fprintf(stderr, &#8220;\\n&#8221;);\n            pthread_mutex_unlock(m_pMyData-&gt;pmutex);     \/\/ \u2461\u6240\u6709\u6a29\u3092\u958b\u653e\u3059\u308b\n            usleep(0);                                   \/\/ \u2605\u4ed6\u306e\u30b9\u30ec\u30c3\u30c9\u306b\u5b9f\u884c\u306e\u30c1\u30e3\u30f3\u30b9\u3092\u4e0e\u3048\u308b\n            dwPrevTime = dwNowTime;\n        }\n    }\n    return(1);\n}<\/p>\n\n\n\n<p class=\"program_discription\">\u671f\u5f85\u901a\u308a\u52d5\u4f5c\u3059\u308b\u3053\u3068\u304c\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p class=\"source_code\">pi@shimodaPi1:~\/PrintMACMutex $ .\/PrintMACMutex\nBBBBB\nAAAAAAAAAAAAAAAAAAAAAAAAA\nCCCC\nAAAAAAAAAAAAAAAAAAAAAAAAA\nBBBBB\nCCCC\nAAAAAAAAAAAAAAAAAAAAAAAAA\nBBBBB\nAAAAAAAAAAAAAAAAAAAAAAAAA\nCCC\nC\nBThreadFunc End\nBBBB\nAThreadFunc End\nAAAAAAAAAAAAAAAAAAAAAAAA\nThreadFunc End<\/p>\n\n\n\n<p class=\"program_discription\">Windows\u7248(CriticalSection, Mutex\u4e21\u65b9\u3068\u3082)o\u3067\u540c\u69d8\u306b{ \u2018A\u2019, 1000, 50, 25 }\u3068\u3066\u3082<br>\u4eca\u56de\u4f7f\u7528\u3057\u3066\u3044\u308bWindows\u306e\u74b0\u5883\u3067\u306f\u3001\u3053\u306e\u73fe\u8c61\u306f\u767a\u751f\u3057\u306a\u3044\u3088\u3046\u3067\u3059\u3002<br>\u5ff5\u306e\u305f\u3081Sleep(0)\u3092\u5165\u308c\u3066\u304a\u304f\u65b9\u304c\u826f\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002<\/p>\n\n\n\n<p class=\"program_discription\">\u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306eAPI\u304cWindows\u3068Linux\u3067\u7570\u306a\u3063\u3066\u3044\u305f\u308a\u3001\u5225\u306e\u540c\u671f\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u306b<br>\u5909\u66f4\u3059\u308b\u3001\u5c11\u3057\u5909\u66f4(Sleep(0)\u3092\u3044\u308c\u308b\u304b\u3001\u3044\u308c\u306a\u3044\u304b)\u3068\u304d\u306b\u3001\u30e1\u30a4\u30f3\u306e\u30bd\u30fc\u30b9\u3092\u5909\u66f4<br>\u3059\u308b\u306e\u306f\u5927\u5909\u306a\u306e\u3067\u4f7f\u3044\u65b9(API)\u3092\u5171\u901a\u5316\u3059\u308b\u305f\u3081\u306e\u30af\u30e9\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3057\u3087\u3046\u3002<br>\u3053\u308c\u306b\u3064\u3044\u3066\u306f\u6b21\u56de\u3068\u3044\u3046\u3053\u3068\u3067\u3002<\/p>\n\n\n\n<p><a href=\"https:\/\/www.oji-koji.com\/pro-files\/PrintMACCriticalSectionWin.zip\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8PrintMACCriticalSection for Windows<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.oji-koji.com\/pro-files\/PrintMACMutexWin.zip\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8PrintMACMutex for Windows<\/a><\/p>\n\n\n\n<p><a href=\"https:\/\/www.oji-koji.com\/pro-files\/PrintMACMutexLinux.zip\">\u30d7\u30ed\u30b8\u30a7\u30af\u30c8PrintMACMutex for Linux<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u56de\u4f5c\u6210\u3057\u305fPrintMAC\u3092\u6b21\u306e\u3088\u3046\u306b\u5909\u66f4\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u5148\u305a\u306f\u3001Windows\u7248\u304b\u3089\u3084\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002 A:1\u79d2\u3054\u3068\u306b50msec\u9593\u9694\u306710\u500b\u8868\u793a B:2.5\u79d2\u3054\u3068\u306b100msec\u9593\u9694\u30675\u500b\u8868\u793a C:3.3\u79d2\u3054\u3068\u306b2 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":129,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_locale":"ja","_original_post":"https:\/\/www.oji-koji.com\/?p=1205","footnotes":""},"categories":[6],"tags":[],"class_list":["post-1205","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-networkprograming","ja"],"_links":{"self":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/1205","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1205"}],"version-history":[{"count":87,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/1205\/revisions"}],"predecessor-version":[{"id":3089,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/posts\/1205\/revisions\/3089"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=\/wp\/v2\/media\/129"}],"wp:attachment":[{"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1205"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1205"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.oji-koji.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1205"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}