C++ ¥é¥¤¥Ö¥é¥ê¡¦¥ê¥Õ¥¡¥ì¥ó¥¹ ¥Û¡¼¥àÌܼ¡Á°¥Ú¡¼¥¸¤Ø¼¡¥Ú¡¼¥¸¤Øº÷°ú


Âè 4 ¾Ï

¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤Ç¤Î½¾Íè·¿¤Î iostream ¥é¥¤¥Ö¥é¥ê¤Î»ÈÍÑ

ËܾϤǤϡ¢¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤Ë¤ª¤±¤ëÆþ½ÐÎϤΤ¿¤á¤Ë¡¢libC ¥é¥¤¥Ö¥é¥ê¤È libisotream ¥é¥¤¥Ö¥é¥ê¤Î iostream ¥¯¥é¥¹¤ò»ÈÍѤ¹¤ëÊýË¡¤òÀâÌÀ¤·¤Þ¤¹¡£¤Þ¤¿¡¢iostream ¥¯¥é¥¹¤«¤éÇÉÀ¸¥¯¥é¥¹¤òºîÀ®¤·¤Æ¡¢¥é¥¤¥Ö¥é¥êµ¡Ç½¤ò³ÈÄ¥¤¹¤ëÎã¤â¼¨¤·¤Þ¤¹¡£¤¿¤À¤·¡¢¤³¤³¤ÇÀâÌÀ¤¹¤ëÆâÍƤϡ¢¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤Ç¼Â¹Ô¤¹¤ë C++ ¥³¡¼¥É¤ò½ñ¤¯¤¿¤á¤Î²òÀâ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£

¤³¤Î¾Ï¤ÎÀâÌÀ¤Ï¡¢¸Å¤¤ iostream (libC ¤ª¤è¤Ólibiostream) ¤ËÂФ·¤Æ¤Î¤ß³ºÅö¤·¡¢C++ ɸ½à¥é¥¤¥Ö¥é¥ê¤ËÁȤ߹þ¤Þ¤ì¤Æ¤¤¤ë¿·¤·¤¤ iostream (libCstd) ¤Ë¤Ï³ºÅö¤·¤Þ¤»¤ó¡£

¥Þ¥ë¥Á¥¹¥ì¥Ã¥É

¥Þ¥ë¥Á¥¹¥ì¥Ã¥É (MT) ¤Ï¡¢¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¾å¤Ç¼Â¹Ô¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¹â®²½¤¹¤ë¶¯ÎϤʵ¡Ç½¤Ç¤¹¡£¥Þ¥ë¥Á¥¹¥ì¥Ã¥Éµ¡Ç½¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤ê¡¢¥Þ¥ë¥Á¥×¥í¥»¥Ã¥µ¤È¥·¥ó¥°¥ë¥×¥í¥»¥Ã¥µ¤ÎξÊý¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¹½Â¤¤ò´ÊÁDz½¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£iostream ¥é¥¤¥Ö¥é¥ê¤¬½¤Àµ¤µ¤ì¤¿¤¿¤á¡¢¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤Ç¼Â¹Ô¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡¢¤¹¤Ê¤ï¤Á Solaris ¥ª¥Ú¥ì¡¼¥Æ¥£¥ó¥°´Ä¶­¤Î Solaris 2.6¡¢7¡¢8 ¡¤Î¤¤¤º¤ì¤«¤Ç¼Â¹Ô¤¹¤ëºÝ¤Ë¥Þ¥ë¥Á¥¹¥ì¥Ã¥Éµ¡Ç½¤òÍøÍѤ¹¤ë¥×¥í¥°¥é¥à¤Ç¡¢libC ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£iostream ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÏÊѹ¹¤µ¤ì¤Þ¤·¤¿¤¬¡¢µì¥Ð¡¼¥¸¥ç¥ó¤Î¥·¥ó¥°¥ë¥¹¥ì¥Ã¥Éµ¡Ç½¤À¤±¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤Ï±Æ¶Á¤¢¤ê¤Þ¤»¤ó¡£

¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤ÇÀµ¤·¤¯¼Â¹Ô¤¹¤ë¤¿¤á¤Ë¤Ï¡¢¥é¥¤¥Ö¥é¥ê¤¬ ¡ÖMT-°ÂÁ´¡×¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£¤½¤Î¤¿¤á¤Ë¤Ï¡¢°ìÈ̤ˤ¹¤Ù¤Æ¤Î¸ø³«´Ø¿ô¤¬ºÆÆþ²Äǽ¤Ë¤Ê¤Ã¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£libC ¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¡¢Ê£¿ô¤Î¥¹¥ì¥Ã¥É¤Ë¶¦Í­¤µ¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È (C++ ¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹) ¤Î¾õÂÖ¤òÊѹ¹¤·¤è¤¦¤È¤¹¤ë¥Þ¥ë¥Á¥¹¥ì¥Ã¥É¤ËÂФ·¤Æ¡¢Êݸǽ¤¬Ä󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤¿¤À¤·¡¢iostream ¥ª¥Ö¥¸¥§¥¯¥È¤Î¡ÖMT-°ÂÁ´¡×¤Î¥¹¥³¡¼¥×¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Î¸ø³«¥á¥ó¥Ð¡¼´Ø¿ô¤Î¼Â¹ÔÃæ¤Ë¸Â¤é¤ì¤Þ¤¹¡£


Ãí°Õ - ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬¡¢libC ¥é¥¤¥Ö¥é¥ê¤Î¡ÖMT-°ÂÁ´¡×¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÈÍѤ·¤Æ¤¤¤ë¤È¤¤¤¦¤À¤±¤Ç¡¢¼«Æ°Åª¤Ë¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤Ç¤Î°ÂÁ´À­¤¬Êݾڤµ¤ì¤ë¤ï¤±¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬¡ÖMT-°ÂÁ´¡×¤È¤Ê¤ë¤Î¤Ï¡¢¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤Ç¤Î¼Â¹Ô¤¬ÁÛÄꤵ¤ì¤Æ¤¤¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¾ì¹ç¤À¤±¤Ç¤¹¡£

¡ÖMT-°ÂÁ´¡×¤Î iostream ¥é¥¤¥Ö¥é¥ê¤Î¹½À®

¡ÖMT-°ÂÁ´¡×¤Î iostream ¥é¥¤¥Ö¥é¥ê¤Î¹½À®¤Ï¡¢¡ÖMT-°ÂÁ´¤Ç¤Ï¤Ê¤¤¡×(¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤Ç¤Ï»ÈÍѤǤ­¤Ê¤¤) iostream ¥é¥¤¥Ö¥é¥ê¤Î¹½À®¤È¾¯¤·°ã¤¤¤Þ¤¹¡£¡ÖMT-°ÂÁ´¡×¤Î iostream ¥é¥¤¥Ö¥é¥ê¤«¤é¸ø³«¤µ¤ì¤Æ¤¤¤ë¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ï¡¢iostream ¥¯¥é¥¹¤È¤½¤Î´ðÄ쥯¥é¥¹¤¹¤Ù¤Æ¤Î¸ø³«¤ª¤è¤Ó¸ÂÄê¸ø³«¥á¥ó¥Ð¡¼´Ø¿ô¤·¤«»²¾È¤·¤Ê¤¤¤³¤È¤Ï¾¤Î¥Ð¡¼¥¸¥ç¥ó¤ÈƱ¤¸¤Ç¤¹¤¬¡¢¥¯¥é¥¹³¬Áؤ¬°Û¤Ê¤ê¤Þ¤¹¡£¾Ü¤·¤¯¤Ï¡¢¡Öiostream ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÊѹ¹¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

ËÜÍè¤Î¥³¥¢¥¯¥é¥¹¤Ï¡¢Ì¾Á°¤ËÀÜƬ¸ì unsafe_ ¤¬ÉÕ¤±¤é¤ì¤Þ¤·¤¿¡£É½ 4-1 ¤Ë¡¢iostream ¥Ñ¥Ã¥±¡¼¥¸¤Î¥³¥¢¥¯¥é¥¹¤ò¼¨¤·¤Þ¤¹¡£

ɽ 4-1   ¥³¥¢¥¯¥é¥¹  
¥¯¥é¥¹ ÆâÍÆ
stream_MT MT-°ÂÁ´¤Î´ðÄ쥯¥é¥¹
streambuf ¥Ð¥Ã¥Õ¥¡¡¼¤Î´ðÄ쥯¥é¥¹
unsafe_ios ¥¨¥é¡¼¾õÂÖ¤ä¥Õ¥©¡¼¥Þ¥Ã¥È¾õÂ֤ʤɤΡ¢¤µ¤Þ¤¶¤Þ¤Ê¥¹¥È¥ê¡¼¥à¥¯¥é¥¹¤Ë¶¦Ä̤ξõÂÖÊÑ¿ô¤ò´Þ¤à¥¯¥é¥¹
unsafe_istream streambuf ¤«¤é¼è¤ê½Ð¤·¤¿Ê¸»ú¥·¡¼¥±¥ó¥¹¤Î¥Õ¥©¡¼¥Þ¥Ã¥ÈÉÕ¤­¤Þ¤¿¤Ï¥Õ¥©¡¼¥Þ¥Ã¥È¤Ê¤·ÊÑ´¹¤ò¥µ¥Ý¡¼¥È¤¹¤ë¥¯¥é¥¹
unsafe_ostream streambuf ¤Ë³ÊǼ¤µ¤ì¤ëʸ»ú¥·¡¼¥±¥ó¥¹¤Î¥Õ¥©¡¼¥Þ¥Ã¥ÈÉÕ¤­¤Þ¤¿¤Ï¥Õ¥©¡¼¥Þ¥Ã¥È¤Ê¤·ÊÑ´¹¤ò¥µ¥Ý¡¼¥È¤¹¤ë¥¯¥é¥¹
unsafe_iostream Æþ½ÐÎÏξÊý¸þ¤ÎÁàºî¤Î¤¿¤á¤Ë unsafe_istream ¥¯¥é¥¹¤È unsafe_ostream ¥¯¥é¥¹¤ò·ë¹ç¤¹¤ë¥¯¥é¥¹


¡ÖMT-°ÂÁ´¡×¤Î³Æ¥¯¥é¥¹¤Ï¡¢´ðÄ쥯¥é¥¹ stream_MT ¤«¤éÇÉÀ¸¤·¤Þ¤¹¡£streambuf ¤ò½ü¤¯¡ÖMT-°ÂÁ´¡×¥¯¥é¥¹¤â¤Þ¤¿¡¢¤¹¤Ù¤Æ̾Á°¤¬ unsafe_ ¤Ç»Ï¤Þ¤ë´û¸¤Î´ðÄ쥯¥é¥¹¤«¤éÇÉÀ¸¤·¤Þ¤¹¡£¼¡¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£

class streambuf: public stream_MT { ... };
class ios: virtual public unsafe_ios, public stream_MT { ... };
class istream: virtual public ios, public unsafe_istream { ... };

stream_MT ¥¯¥é¥¹¤Ï¡¢¤½¤ì¤¾¤ì¤Î iostream ¥¯¥é¥¹¤ò¡ÖMT-°ÂÁ´¡×¤Ë¤¹¤ë¤¿¤á¤ËɬÍפÊÁê¸ßÇÓ¾¥í¥Ã¥¯µ¡Ç½¤òÄ󶡤·¤Þ¤¹¡£¤Þ¤¿Æ°Åª¤Ë¥í¥Ã¥¯¤È¥í¥Ã¥¯²ò½ü¤ò¹Ô¤¦µ¡Ç½¤âÄ󶡤·¡¢¡ÖMT-°ÂÁ´¡×ÆÃÀ­¤ÎưŪÊѹ¹¤ò²Äǽ¤Ë¤·¤Þ¤¹¡£Æþ½ÐÎÏÊÑ´¹¤È¥Ð¥Ã¥Õ¥¡¡¼´ÉÍý¤Î´ðËܵ¡Ç½¤Ï¡¢Ì¾Á°¤¬ unsafe_ ¤Ç»Ï¤Þ¤ë¥¯¥é¥¹¤Ë¤Þ¤È¤á¤é¤ì¤Æ¤ª¤ê¡¢¡ÖMT-°ÂÁ´¡×¤Ë¤¹¤ë¤¿¤á¤Ë¥é¥¤¥Ö¥é¥ê¤ËÄɲä·¤¿µ¡Ç½¤Ï¡¢¤½¤ÎÇÉÀ¸¥¯¥é¥¹¤Ë¸Â¤é¤ì¤Þ¤¹¡£¡ÖMT-°ÂÁ´¡×¤Î³Æ¥¯¥é¥¹¤ËÆþ¤Ã¤Æ¤¤¤ë¸ø³«¤ª¤è¤Ó¸ÂÄê¸ø³«¥á¥ó¥Ð¡¼´Ø¿ô¤Ï¡¢Ì¾Á°¤¬ unsafe_ ¤Ç»Ï¤Þ¤ë´ðÄ쥯¥é¥¹¤ÈƱ¤¸¤Ç¤¹¡£¡ÖMT-°ÂÁ´¡×¤Î¥¯¥é¥¹¤Î³Æ¥á¥ó¥Ð¡¼´Ø¿ô¤Ï¥é¥Ã¥Ñ¡¼¤È¤·¤ÆƯ¤­¡¢¥ª¥Ö¥¸¥§¥¯¥È¤Î¥í¥Ã¥¯¸å¡¢Ì¾Á°¤¬ unsafe_ ¤Ç»Ï¤Þ¤ë´ðÄ쥯¥é¥¹¤ÎƱ¤¸´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¡¢ºÇ¸å¤Ë¤½¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¥í¥Ã¥¯¤ò²ò½ü¤·¤Þ¤¹¡£


Ãí - streambuf ¥¯¥é¥¹¤Ï¡¢Ì¾Á°¤¬ unsafe_ ¤Ç»Ï¤Þ¤ë¥¯¥é¥¹¤«¤éÇÉÀ¸¤·¤¿¥¯¥é¥¹¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£streambuf ¥¯¥é¥¹¤Î¸ø³«¤ª¤è¤Ó¸ÂÄê¸ø³«¥á¥ó¥Ð¡¼´Ø¿ô¤Ï¡¢¥í¥Ã¥¯µ¡Ç½¤Ë¤è¤êºÆÆþ²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£_unlocked ¤È¤¤¤¦ÀÜÈø¼­¤ÎÉÕ¤¤¤¿¥í¥Ã¥¯¤Ê¤·¤Î¤â¤Î¤âÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£

¸ø³«ÊÑ´¹¥ë¡¼¥Á¥ó

iostream ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤Ï¡¢¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤Ç»ÈÍѤ·¤Æ¤â°ÂÁ´¤Ç¡¢¤«¤ÄºÆÆþ²Äǽ¤Ê¸ø³«´Ø¿ô¤¬¤¤¤¯¤Ä¤«Äɲ䵤ì¤Æ¤¤¤Þ¤¹¡£³Æ´Ø¿ô¤ÎÄɲðú¿ô¤È¤·¤Æ¡¢¥æ¡¼¥¶¡¼ÄêµÁ¥Ð¥Ã¥Õ¥¡¡¼¤ò»ØÄꤷ¤Þ¤¹¡£¼¡¤Ë´Ø¿ô¤ÎÆâÍƤò¼¨¤·¤Þ¤¹¡£

ɽ 4-2   ºÆÆþ²Äǽ¤Ê¸ø³«´Ø¿ô
´Ø¿ô ÆâÍÆ
char *oct_r (char *buf, 
            int buflen,
            long num, 
            int width)
¿ôÃͤò 8 ¿Êɽ¼¨¤·¤¿ ASCII ʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤·¤Þ¤¹¡£Éý¤¬¥¼¥í°Ê³°¤Î¾ì¹ç¤Ï¡¢¥Õ¥©¡¼¥Þ¥Ã¥ÈÍѤΥե£¡¼¥ë¥ÉÉý¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£Ìá¤êÃͤ¬¥æ¡¼¥¶¡¼Ä󶡥Хåե¡¡¼¤ÎÀèƬ¤ò»Ø¤·¤Æ¤¤¤ë¤³¤È¤ÏÊݾڤµ¤ì¤Þ¤»¤ó¡£
char *hex_r (char *buf, 
            int buflen,
            long num, 
            int width)
¿ôÃͤò 16 ¿Êɽ¼¨¤·¤¿ ASCII ʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤·¤Þ¤¹¡£Éý¤¬¥¼¥í°Ê³°¤Î¾ì¹ç¤Ï¡¢¥Õ¥©¡¼¥Þ¥Ã¥ÈÍѤΥե£¡¼¥ë¥ÉÉý¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£Ìá¤êÃͤ¬¥æ¡¼¥¶¡¼Ä󶡥Хåե¡¡¼¤ÎÀèƬ¤ò»Ø¤·¤Æ¤¤¤ë¤³¤È¤ÏÊݾڤµ¤ì¤Þ¤»¤ó¡£
char *dec_r (char *buf, 
            int buflen,
            long num, 
            int width)
¿ôÃͤò 10 ¿Êɽ¼¨¤·¤¿ ASCII ʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤·¤Þ¤¹¡£Éý¤¬¥¼¥í°Ê³°¤Î¾ì¹ç¤Ï¡¢¥Õ¥©¡¼¥Þ¥Ã¥ÈÍѤΥե£¡¼¥ë¥ÉÉý¤È¤ß¤Ê¤µ¤ì¤Þ¤¹¡£Ìá¤êÃͤ¬¥æ¡¼¥¶¡¼Ä󶡥Хåե¡¡¼¤ÎÀèƬ¤ò»Ø¤·¤Æ¤¤¤ë¤³¤È¤ÏÊݾڤµ¤ì¤Þ¤»¤ó¡£
char *chr_r (char *buf, 
            int buflen,
            int chr,
            int width)
ʸ»úÎó chr ¤¬´Þ¤Þ¤ì¤¿ ASCII ʸ»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤·¤Þ¤¹¡£Éý¤¬¥¼¥í°Ê³°¤Î¾ì¹ç¤Ï¡¢Ê¸»úÎó¤Ë¤Ï width ¸Ä¤Î¥¹¥Ú¡¼¥¹¤Ë³¤¤¤Æ chr ¤¬´Þ¤Þ¤ì¤Þ¤¹¡£Ìá¤êÃͤ¬¥æ¡¼¥¶¡¼Ä󶡥Хåե¡¡¼¤ÎÀèƬ¤ò»Ø¤·¤Æ¤¤¤ë¤³¤È¤ÏÊݾڤµ¤ì¤Þ¤»¤ó¡£
char *form_r (char *buf, 
             int buflen,
             const char
             *form,...)
¥Õ¥©¡¼¥Þ¥Ã¥Èʸ»úÎó format ¤Ë³¤¯°ú¿ô¤ò sprintf ¤Ç¥Õ¥©¡¼¥Þ¥Ã¥È¤·¤¿Ê¸»úÎó¤Ø¤Î¥Ý¥¤¥ó¥¿¤òÊÖ¤·¤Þ¤¹¡£¥Ð¥Ã¥Õ¥¡¡¼¤Ë¤Ï¡¢¥Õ¥©¡¼¥Þ¥Ã¥ÈºÑ¤ßʸ»úÎó¤òÆþ¤ì¤ë¤¿¤á¤Î½½Ê¬¤ÊŤµ¤¬É¬ÍפǤ¹¡£



Ãí°Õ - µì¥Ð¡¼¥¸¥ç¥ó¤Î libC ¥é¥¤¥Ö¥é¥ê¤È¤Î¸ß´¹À­¤òÊݤĤ¿¤á¤ËÄ󶡤µ¤ì¤Æ¤¤¤ë iostream ¥é¥¤¥Ö¥é¥ê¤Î¸ø³«ÊÑ´¹¥ë¡¼¥Á¥ó (oct¡¢hex¡¢dec¡¢chr¡¢form) ¤Ï¡¢¡ÖMT-°ÂÁ´¡×¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£

¡ÖMT-°ÂÁ´¡×¤Î libC ¥é¥¤¥Ö¥é¥ê¤Î¥³¥ó¥Ñ¥¤¥ë¤È¥ê¥ó¥¯

¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤Ç¼Â¹Ô¤¹¤ë¤¿¤á¤Ë¡¢libC ¥é¥¤¥Ö¥é¥ê¤Î iostream ¥¯¥é¥¹¤ò»ÈÍѤ·¤ÆºîÀ®¤·¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤Ä¤¤¤Æ¤Ï¡¢¥½¡¼¥¹¥³¡¼¥É¤Î¥³¥ó¥Ñ¥¤¥ë¤È¥ê¥ó¥¯»þ¤Ë -mt ¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¡¢¥×¥ê¥×¥í¥»¥Ã¥µ (Á°½èÍýÉô) ¤Ë¤Ï -D_REENTRANT ¤¬¡¢¥ê¥ó¥«¡¼¤Ë¤Ï -lthread ¤¬ÅϤµ¤ì¤Þ¤¹¡£


Ãí - libC ¤ª¤è¤Ó libthread ¤È¤Î¥ê¥ó¥¯¤Ë¤Ï¡¢-lthread ¤Ç¤Ï¤Ê¤¯ -mt ¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£-mt ¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¥é¥¤¥Ö¥é¥ê¤ÎÀµ¤·¤¤½çÈ֤ǤΥê¥ó¥¯¤¬Êݾڤµ¤ì¤Þ¤¹¡£¸í¤Ã¤Æ -lthread ¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢¤½¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÏÀµ¤·¤¯Æ°¤«¤Ê¤¤¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£

iostream ¥¯¥é¥¹¤ò»ÈÍѤ¹¤ë¥·¥ó¥°¥ë¥¹¥ì¥Ã¥ÉÍѤΥ¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤ÏÆÃÊ̤ʥ³¥ó¥Ñ¥¤¥é¤ä¥ê¥ó¥«¡¼¥ª¥×¥·¥ç¥ó¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£¥Ç¥Õ¥©¥ë¥È¤Ç¡¢¥³¥ó¥Ñ¥¤¥é¤Ï libC ¥é¥¤¥Ö¥é¥ê¤È¥ê¥ó¥¯¤·¤Þ¤¹¡£

¡ÖMT-°ÂÁ´¡×¤Î iostream ¥é¥¤¥Ö¥é¥ê¤ÎÀ©¸Â

iostream ¥é¥¤¥Ö¥é¥ê¤Î¥Þ¥ë¥Á¥¹¥ì¥Ã¥É¤ËÂФ¹¤ë°ÂÁ´À­¤ËÀ©¸Â¤¬¤¢¤ë¤Î¤Ï¡¢iostream ¥é¥¤¥Ö¥é¥ê¤Ç»ÈÍѤ·¤Æ¤¤¤ë¥×¥í¥°¥é¥ß¥ó¥°¼êË¡¤Î¿¤¯¤¬¡¢¶¦Í­ iostream ¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÈÍѤ¹¤ë¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤Ç¤ÏÀµ¤·¤¯¼Â¹Ô¤Ç¤­¤Ê¤¤¤¿¤á¤Ç¤¹¡£

¥¨¥é¡¼¾õÂ֤θ¡ºº

¡ÖMT-°ÂÁ´¡×¤Ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢¥¨¥é¡¼¤òµ¯¤³¤¹¤è¤¦¤ÊÆþ½ÐÎÏÁàºî¤òȼ¤¦´í¸±Îΰè¤Ç¤Ï¡¢Æþ½ÐÎϤΥ¨¥é¡¼¤òÄ´¤Ù¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

¥³¡¼¥ÉÎã 4-1   ¥¨¥é¡¼¾õÂ֤θ¡ºº 
#include <iostream.h>
#include <rlocks.h>
enum iostate { IOok, IOeof, IOfail };

iostate read_number(istream& istr, int& num)
{
    stream_locker sl(istr, stream_locker::lock_now);

    istr >> num;

    if (istr.eof()) return IOeof;
    if (istr.fail()) return IOfail;
    return IOok;
}

¤³¤ÎÎã¤Ç¤Ï¡¢stream_locker ¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë sl ¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤¬ istream
¥ª¥Ö¥¸¥§¥¯¥È¤Î istr ¤ò¥í¥Ã¥¯¤·¤Æ¤¤¤Þ¤¹¡£sl ¤Î¥Ç¥¹¥È¥é¥¯¥¿¤Ï¡¢read_number ¤Î
½ªÎ»»þ¤Ë¸Æ¤Ð¤ì¡¢istr ¤Î¥í¥Ã¥¯¤ò²ò½ü¤·¤Þ¤¹¡£

ºÇ¸å¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¤Ê¤·ÆþÎÏÁàºî¤ÇÃê½Ð¤µ¤ì¤¿Ê¸»ú¤Î¼èÆÀ

¡ÖMT-°ÂÁ´¡×¤Ë¤¹¤ë¤Ë¤Ï¡¢ºÇ¤â¶á¤¤¥Õ¥©¡¼¥Þ¥Ã¥È¤Ê¤·Æþ½ÐÎϤȤ½¤ì¤Ë³¤¯ gcount ¸Æ¤Ó½Ð¤·¤Î´Ö¤Ë¡¢iostream ¥ª¥Ö¥¸¥§¥¯¥È¤òÇÓ¾Ū¤Ë»ÈÍѤ¹¤ë¥¹¥ì¥Ã¥ÉÆâ¤Ç gcount ´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤ò¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

¥³¡¼¥ÉÎã 4-2   gcount ¤Î¸Æ¤Ó½Ð¤·
#include <iostream.h>	
#include <rlocks.h>
void fetch_line(istream& istr, char* line, int& linecount)
{
    stream_locker sl(istr, stream_locker::lock_defer);

    sl.lock(); // ¥¹¥È¥ê¡¼¥à istr ¤ò¥í¥Ã¥¯
    istr >> line;
    linecount = istr.gcount();
    sl.unlock(); // istr ¤Î¥í¥Ã¥¯²ò½ü
    ...
}

¤³¤ÎÎã¤Ç¤Ï¡¢stream_locker ¥¯¥é¥¹¤Î lock ¥á¥ó¥Ð¡¼´Ø¿ô¤ª¤è¤Ó unlock ¥á¥ó¥Ð¡¼´Ø¿ô¤¬¥×¥í¥°¥é¥àÃæ¤ÇÁê¸ßÇÓ¾Îΰè¤òÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£

¥æ¡¼¥¶¡¼ÄêµÁ¤ÎÆþ½ÐÎÏÁàºî

¡ÖMT-°ÂÁ´¡×¤Ë¤¹¤ë¤Ë¤Ï¡¢¥æ¡¼¥¶¡¼ÄêµÁ·¿¤ËÂФ·¤ÆÄêµÁ¤µ¤ì¤¿Æþ½ÐÎÏÁàºî¤ÇÆÃÄê¤ÎÁàºî½ç½ø¤ò»ý¤Ä¤â¤Î¤Ï¡¢¥í¥Ã¥¯¤·¤Æ´í¸±Îΰè¤òÄêµÁ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

¥³¡¼¥ÉÎã 4-3    ¥æ¡¼¥¶¡¼ÄêµÁ¤ÎÆþ½ÐÎÏÁàºî
#include <rlocks.h>
#include <iostream.h>
class mystream: public istream {

    // ¤½¤Î¾¤ÎÄêµÁ...
    int getRecord(char* name, int& id, float& gpa);
}

#include <rlocks.h>
#include <iostream.h>
int mystream::getRecord(char* name, int& id, float& gpa)
{
    stream_locker sl(this, stream_locker::lock_now);

    *this >> name;
    *this >> id;
    *this >> gpa;
    return this->fail() == 0;
}

¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹

¸½¥Ð¡¼¥¸¥ç¥ó¤Î libC ¥é¥¤¥Ö¥é¥ê¤Î¡ÖMT-°ÂÁ´¡×¤Î¥¯¥é¥¹¤ò»ÈÍѤ¹¤ë¤È¡¢¥·¥ó¥°¥ë¥¹¥ì¥Ã¥É¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¾ì¹ç¤Ç¤â¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬µ¯¤³¤ê¤Þ¤¹¡£libC ¥é¥¤¥Ö¥é¥ê¤Î unsafe_ ¥¯¥é¥¹¤ò»ÈÍѤ¹¤ë¤È¡¢¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤Ï¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£

¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢¥¹¥³¡¼¥×·èÄê±é»»»Ò¤ò»ÈÍѤ·¤Æ unsafe_ ´ðÄ쥯¥é¥¹¤Î¥á¥ó¥Ð¡¼´Ø¿ô¤ò¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

cout.unsafe_ostream::put('4');

cin.unsafe_istream::read(buf, len);


Ãí - ¥Þ¥ë¥Á¥¹¥ì¥Ã¥ÉÂбþ¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢unsafe_ ¥¯¥é¥¹¤Î»ÈÍÑ¤Ï´í¸±¤Ç¤¹¡£

¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢unsafe_ ¥¯¥é¥¹¤ò»ÈÍѤ¹¤ëÂå¤ï¤ê¤Ë¡¢cout ¥ª¥Ö¥¸¥§¥¯¥È¤È cin ¥ª¥Ö¥¸¥§¥¯¥È¤ò¡ÖMT-°ÂÁ´¤Ç¤Ï¤Ê¤¤¡×¤È¤·¤Æ¡¢Ä̾ï¤ÎÁàºî¤ò»ÈÍѤ¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£¤³¤Î¾ì¹ç¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤Ï¤ï¤º¤«¤ËÄã²¼¤·¤Þ¤¹¡£

¥³¡¼¥ÉÎã 4-4   ¡ÖMT-°ÂÁ´¡×¤Î̵¸ú²½
#include <iostream.h>
//¡ÖMT-°ÂÁ´¤Ç¤Ï¤Ê¤¤¡×¤ËÀßÄê
cout.set_safe_flag(stream_MT::unsafe_object);
//¡ÖMT-°ÂÁ´¤Ç¤Ï¤Ê¤¤¡×¤ËÀßÄê
cin.set_safe_flag(stream_MT::unsafe_object);
cout.put('4');
cin.read(buf, len);

iostream ¥ª¥Ö¥¸¥§¥¯¥È¤¬¡ÖMT-°ÂÁ´¡×¤Ç¤¢¤ë¾ì¹ç¤Ï¡¢Áê¸ßÇÓ¾¥í¥Ã¥¯µ¡Ç½¤¬Ä󶡤µ¤ì¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥á¥ó¥Ð¡¼ÊÑ¿ô¤¬Êݸ¤ì¤Þ¤¹¡£¤³¥í¥Ã¥¯µ¡Ç½¤Î¤¿¤á¡¢¥·¥ó¥°¥ë¥¹¥ì¥Ã¥É´Ä¶­¤Ç¤Î¤ß¼Â¹Ô¤µ¤ì¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¾ì¹ç¤ÏÉÔÍפʥª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬¤«¤«¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢iostream ¥ª¥Ö¥¸¥§¥¯¥È¤Î¡ÖMT-°ÂÁ´¡×¤È¡ÖMT-°ÂÁ´¤Ç¤Ï¤Ê¤¤¡×¤òưŪ¤ËÀڤ괹¤¨¤Æ¡¢¥Ñ¥Õ¥©¡¼¥Þ¥ó¥¹¤ò¸þ¾å¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

¥³¡¼¥ÉÎã 4-5   ¡ÖMT-°ÂÁ´¤Ç¤Ï¤Ê¤¤¡×¤ÎÀڤ괹¤¨
fs.set_safe_flag(stream_MT::unsafe_object);//¡ÖMT-°ÂÁ´¤Ç¤Ï¤Ê¤¤¡×¤ËÀßÄê
... ¤µ¤Þ¤¶¤Þ¤ÊÆþ½ÐÎÏÁàºî¤ò¼Â¹Ô

iostream ¤¬Ê£¿ô¥¹¥ì¥Ã¥É¤Ë¶¦Í­¤µ¤ì¤Ê¤¤¾ì¹ç¡¢¤¿¤È¤¨¤Ð¥¹¥ì¥Ã¥É¤¬ 1 ¤Ä¤·¤«¤Ê¤¤¥×¥í¥°¥é¥à¤ä¡¢³Æ iostream ¤¬¤½¤ì¤¾¤ì¤Î¥¹¥ì¥Ã¥É¤ËÂФ·¤ÆÈó¸ø³«¤Ê¥×¥í¥°¥é¥à¤Î¾ì¹ç¤Ï¡¢ ¡ÖMT-°ÂÁ´¤Ç¤Ï¤Ê¤¤¡×¤Î¥¹¥È¥ê¡¼¥à¤ò»ÈÍѤ·¤Æ¤âÌäÂꤢ¤ê¤Þ¤»¤ó¡£

¤Þ¤¿¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢¥×¥í¥°¥é¥àÆâ¤ÇÌÀ¼¨Åª¤ËƱ´ü¤ò¤È¤é¤»¤ë¾ì¹ç¤Ï¡¢iostream ¤¬Ê£¿ô¥¹¥ì¥Ã¥É¤Ë¶¦Í­¤µ¤ì¤ë´Ä¶­¤Ç¡ÖMT-°ÂÁ´¤Ç¤Ï¤Ê¤¤¡×¤Î iostream ¤ò»ÈÍѤ·¤Æ¤âÌäÂꤢ¤ê¤Þ¤»¤ó¡£

¥³¡¼¥ÉÎã 4-6   ¡ÖMT-°ÂÁ´¤Ç¤Ï¤Ê¤¤¡×¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÈÍѤ·¤ÆƱ´ü¤ò¤È¤ëÊýË¡
generic_lock() ;  
fs.set_safe_flag(stream_MT::unsafe_object) ;
... ¤µ¤Þ¤¶¤Þ¤ÊÆþ½ÐÎÏÁàºî¤ò¼Â¹Ô
generic_unlock() ;

¤³¤³¤Ç¡¢generic_lock ¤È generic_unlock ¤Î´Ø¿ô¤Ï¡¢Áê¸ßÇÓ¾¡¢¥»¥Þ¥Õ¥©¡¢Æɤ߼è¤ê¤È½ñ¤­¹þ¤ß¤Î¤è¤¦¤Êñ½ã·¿¤ò»ÈÍѤ·¤¿Æ±´üµ¡¹½¤òÄ󶡤¹¤ë¤â¤Î¤Ç¤¢¤ì¤Ð²¿¤Ç¤â¤«¤Þ¤¤¤Þ¤»¤ó¡£


Ãí - ¤³¤Î¤è¤¦¤ÊÌÜŪ¤Ç»ÈÍѤ¹¤ë¤Ë¤Ï¡¢libC ¥é¥¤¥Ö¥é¥ê¤ÇÄ󶡤µ¤ì¤Æ¤¤¤ë stream_locker ¥¯¥é¥¹¤ò¤ª´«¤á¤·¤Þ¤¹¡£

¾ÜºÙ¤Ï¡¢¡Ö¥ª¥Ö¥¸¥§¥¯¥È¤Î¥í¥Ã¥¯¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

iostream ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÊѹ¹

¤³¤Î¹à¤Ç¤Ï¡¢libC ¥é¥¤¥Ö¥é¥ê¤ò¡ÖMT-°ÂÁ´¡×¤Ë¤¹¤ë¤¿¤á¤Ë¡¢iostream ¥é¥¤¥Ö¥é¥ê¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤¬¤É¤Î¤è¤¦¤ËÊѹ¹¤µ¤ì¤¿¤«¤òÀâÌÀ¤·¤Þ¤¹¡£

¿·¤·¤¤¥¯¥é¥¹

¼¡¤Îɽ¤Ï¡¢libC ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¿·¤·¤¯Äɲ䵤줿¥¯¥é¥¹¤Î¥ê¥¹¥È¤Ç¤¹¡£

¥³¡¼¥ÉÎã 4-7   ¿·¤·¤¤¥¯¥é¥¹
stream_MT							
stream_locker								
unsafe_ios								
unsafe_istream								
unsafe_ostream					
unsafe_iostream								
unsafe_fstreambase								
unsafe_strstreambase								

¿·¤·¤¤¥¯¥é¥¹³¬ÁØ

¼¡¤Îɽ¤Ï¡¢iostream ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¿·¤·¤¯Äɲ䵤줿¥¯¥é¥¹³¬ÁؤΥꥹ¥È¤Ç¤¹¡£

¥³¡¼¥ÉÎã 4-8   ¿·¤·¤¤¥¯¥é¥¹³¬ÁØ 
class streambuf : public stream_MT { ... };
class unsafe_ios { ... };
class ios : virtual public unsafe_ios, public stream_MT  {...};
class unsafe_fstreambase : virtual public unsafe_ios { ... };
class fstreambase : virtual public ios, public unsafe_fstreambase 
{ ... };
class unsafe_strstreambase : virtual public unsafe_ios { ... };
class strstreambase : virtual public ios, public 
unsafe_strstreambase { ... };
class unsafe_istream : virtual public unsafe_ios  { ... };
class unsafe_ostream : virtual public unsafe_ios  { ... };
class istream : virtual public ios, public unsafe_istream { ... };
class ostream : virtual public ios, public unsafe_ostream { ... };
class unsafe_iostream : public unsafe_istream, public 
unsafe_ostream { ... };

¿·¤·¤¤´Ø¿ô

¼¡¤Îɽ¤Ï¡¢iostream ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¿·¤·¤¯Äɲ䵤줿´Ø¿ô¤Î¥ê¥¹¥È¤Ç¤¹¡£

¥³¡¼¥ÉÎã 4-9   ¿·¤·¤¤´Ø¿ô 

class streambuf {
public:
    int sgetc_unlocked();									
    void sgetn_unlocked(char *, int);											
    int snextc_unlocked();											
    int sbumpc_unlocked();											
    void stossc_unlocked();											
    int in_avail_unlocked();											
    int sputbackc_unlocked(char);											
    int sputc_unlocked(int);											
    int sputn_unlocked(const char *, int);											
    int out_waiting_unlocked();											
protected:
    char* base_unlocked();											
    dhar* ebuf_unlocked();											
    int blen_unlocked();											
    char* pbase_unlocked();											
    char* eback_unlocked();											
    char* gptr_unlocked();											
    char* egptr_unlocked();											
    char* pptr_unlocked();											
    void setp_unlocked(char*, char*);											
    void setg_unlocked(char*, char*, char*);											
    void pbump_unlocked(int);											
    void gbump_unlocked(int);											
    void setb_unlocked(char*, char*, int);											

		int unbuffered_unlocked();											
		char *epptr_unlocked();											
		void unbuffered_unlocked(int);											
		int allocate_unlocked(int);											
};

class filebuf : public streambuf {
public:
	int is_open_unlocked();												
	filebuf* close_unlocked();												
	filebuf* open_unlocked(const char*, int, int=filebuf::openprot);
														
	filebuf* attach_unlocked(int);												
};

class strstreambuf : public streambuf {
public:
	int freeze_unlocked();												
	char* str_unlocked();												
};
	
unsafe_ostream& endl(unsafe_ostream&);													
unsafe_ostream& ends(unsafe_ostream&);													
unsafe_ostream& flush(unsafe_ostream&);													
unsafe_istream& ws(unsafe_istream&);													
unsafe_ios& dec(unsafe_ios&);													
unsafe_ios& hex(unsafe_ios&);													
unsafe_ios& oct(unsafe_ios&);													

char* dec_r (char* buf, int buflen, long num, int width)
char* hex_r (char* buf, int buflen, long num, int width)
char* oct_r (char* buf, int buflen, long num, int width) 
char* chr_r (char* buf, int buflen, long chr, int width)
char* str_r (char* buf, int buflen, const char* format, int width = 0);
char* form_r (char* buf, int buflen, const char* format, ...) 

Âç°è¥Ç¡¼¥¿¤ÈÀÅŪ¥Ç¡¼¥¿

¥Þ¥ë¥Á¥¹¥ì¥Ã¥ÉÂбþ¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢Âç°è¥Ç¡¼¥¿¤ÈÀÅŪ¥Ç¡¼¥¿¤ò¥¹¥ì¥Ã¥É´Ö¤Ç°ÂÁ´¤Ë¶¦Í­¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó¡£³Æ¥¹¥ì¥Ã¥É¤ÏÆÈΩ¤·¤Æ¼Â¹Ô¤µ¤ì¤Þ¤¹¤¬¡¢Âç°è¥Ç¡¼¥¿¤ÈÀÅŪ¥Ç¡¼¥¿¤Ø¤Î¥¢¥¯¥»¥¹¤Ï¥×¥í¥»¥¹Æâ¤Î¥¹¥ì¥Ã¥É´Ö¤Ç¶¦Í­¤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤½¤Î¤è¤¦¤Ê¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤ò¤¢¤ë¥¹¥ì¥Ã¥É¤¬Êѹ¹¤¹¤ë¤È¡¢¥×¥í¥»¥¹Æâ¤Î¤½¤Î¾¤ÎÁ´¥¹¥ì¥Ã¥É¤¬¤½¤ÎÊѹ¹¤Î±Æ¶Á¤ò¼õ¤±¡¢É¬ÍפʴÖƱ¤¸¾õÂÖ¤òÊݤĤ³¤È¤¬´üÂԤǤ­¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£C++ ¤Ç¤Ï¡¢¥¯¥é¥¹¥ª¥Ö¥¸¥§¥¯¥È (¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹) ¤Î¾õÂ֤ϥá¥ó¥Ð¡¼ÊÑ¿ô¤ÎÃͤǼ¨¤µ¤ì¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢¤½¤Î¥¯¥é¥¹¥ª¥Ö¥¸¥§¥¯¥È¤¬¶¦Í­¤µ¤ì¤Æ¤¤¤ì¤Ð¡¢Â¾¤Î¥¹¥ì¥Ã¥É¤«¤é¤âÊѹ¹¤µ¤ì¤Æ¤·¤Þ¤¤¤Þ¤¹¡£

¥Þ¥ë¥Á¥¹¥ì¥Ã¥ÉÂбþ¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç iostream ¥é¥¤¥Ö¥é¥ê¤ò»ÈÍѤ·¡¢
iostream.h ¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¤Æ¤¤¤ë¾ì¹ç¡¢É¸½à¥¹¥È¥ê¡¼¥à (cout¡¢cin¡¢cerr¡¢clog) ¤Ï¡¢¥Ç¥Õ¥©¥ë¥È¤ÇÂç°èŪ¤Ê¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤ÆÄêµÁ¤µ¤ì¤Þ¤¹¡£iostream ¥é¥¤¥Ö¥é¥ê¤Ï¡ÖMT-°ÂÁ´¡×¤Ê¤Î¤Ç¡¢iostream ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥á¥ó¥Ð¡¼´Ø¿ô¤Î¼Â¹ÔÃæ¤Ï¡¢¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤Î¾õÂ֤Ͼ¤Î¥¹¥ì¥Ã¥É¤«¤é¤Î¥¢¥¯¥»¥¹¤äÊѹ¹¤«¤éÊݸ¤ì¤Æ¤¤¤Þ¤¹¡£¤¿¤À¤· iostream ¥ª¥Ö¥¸¥§¥¯¥È¤Î¡ÖMT-°ÂÁ´¡×¤¬Í­¸ú¤Ê¤Î¤Ï¡¢¤½¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¸ø³«¥á¥ó¥Ð¡¼´Ø¿ô¤Î¼Â¹ÔÃæ¤Ë¸Â¤é¤ì¤Þ¤¹¡£¼¡¤ÎÎã¤ò¹Í¤¨¤Æ¤ß¤Þ¤·¤ç¤¦¡£

    int c;
cin.get(c);

¤³¤Î¥³¡¼¥É¤Ç¥¹¥ì¥Ã¥É A ¤¬ get ¥Ð¥Ã¥Õ¥¡¤«¤é¼¡¤Îʸ»ú¤ò¼è¤ê½Ð¤·¡¢¥¹¥ì¥Ã¥É A ¤Î¥Ð¥Ã¥Õ¥¡¡¼¥Ý¥¤¥ó¥¿¤ò¹¹¿·¤·¤Þ¤¹¡£¤È¤³¤í¤¬¡¢¥¹¥ì¥Ã¥É A ¤Î¼¡¤ÎÌ¿Î᤬¤ä¤Ï¤ê get ¤Î¸Æ¤Ó½Ð¤·¤Ç¤¢¤Ã¤Æ¤â¡¢Ê¸»ú¥·¡¼¥±¥ó¥¹¤«¤é¤½¤Î¼¡¤Îʸ»ú¤¬¼è¤ê½Ð¤µ¤ì¤ë¤È¤¤¤¦ÊÝ¾Ú¤Ï libC ¥é¥¤¥Ö¥é¥ê¤Ë¤ª¤¤¤Æ¤Ï¤¢¤ê¤Þ¤»¤ó¡£¤Ê¤¼¤Ê¤é¡¢¥¹¥ì¥Ã¥É A ¤Ë¤è¤ë 2 ¤Ä¤Î get ¤Î¸Æ¤Ó½Ð¤·¤Î´Ö¤Ë¡¢¤¿¤È¤¨¤Ð¥¹¥ì¥Ã¥É B ¤¬ get ¤Î¸Æ¤Ó½Ð¤·¤ò¹Ô¤¦²ÄǽÀ­¤¬¤¢¤ë¤«¤é¤Ç¤¹¡£

¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤È¥Þ¥ë¥Á¥¹¥ì¥Ã¥É¤Ë¤ª¤±¤ë¤³¤Î¤è¤¦¤ÊÌäÂê¤ò²ò·è¤¹¤ëÊýË¡¤Ë¤Ä¤¤¤Æ¤Ï¡¢¡Ö¥ª¥Ö¥¸¥§¥¯¥È¤Î¥í¥Ã¥¯¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

½ç¼¡¼Â¹Ô

iostream ¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÈÍѤ¹¤ë¤È¡¢°ìÏ¢¤ÎÆþ½ÐÎÏÁàºî¤ò¡ÖMT-°ÂÁ´¡×¤Ë¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¾õ¶·¤¬ÉÑÈˤ˵¯¤³¤ê¤Þ¤¹¡£¼¡¤Î¥³¡¼¥É¤òÎã¤Ë¹Í¤¨¤Æ¤ß¤Þ¤·¤ç¤¦¡£

cout << " Error message:" << errstring[err_number] << "\n";

¤³¤Î¥³¡¼¥É¤Ë¤Ï¡¢cout ¥¹¥È¥ê¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î 3 ¤Ä¤Î¥á¥ó¥Ð¡¼´Ø¿ô¤Î¼Â¹Ô¤¬´Þ¤Þ¤ì¤Æ¤¤¤Þ¤¹¡£ cout ¤Ï¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¹¤«¤é¡¢¤³¤Î¥³¡¼¥É¤ò¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤ÇÀµ¤·¤¯¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢°ìÏ¢¤ÎÆþ½ÐÎÏÁàºî¤¬´í¸±Îΰè¤È¤·¤ÆÉÔ²Äʬ̿ÎáŪ¤Ë¼Â¹Ô¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£iostream ¥¯¥é¥¹¥ª¥Ö¥¸¥§¥¯¥È¤Î°ìÏ¢¤ÎÆþ½ÐÎÏÁàºî¤òÉÔ²Äʬ̿ÎáŪ¤Ë¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¤Ê¤ó¤é¤«¤Î¥í¥Ã¥¯¤ò¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£

libC ¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¡¢iostream ¥ª¥Ö¥¸¥§¥¯¥È¤ÎÁàºî¤ò¥í¥Ã¥¯¤¹¤ë¤¿¤á¤Î stream_locker ¥¯¥é¥¹¤¬Ä󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£stream_locker ¥¯¥é¥¹¤Ë¤Ä¤¤¤Æ¤Ï¡¢¼¡¤Î¡Ö¥ª¥Ö¥¸¥§¥¯¥È¤Î¥í¥Ã¥¯¡×¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

¥ª¥Ö¥¸¥§¥¯¥È¤Î¥í¥Ã¥¯

¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤È¥Þ¥ë¥Á¥¹¥ì¥Ã¥É¤Çµ¯¤³¤ëÌäÂê¤ÎºÇ¤â´Êñ¤Ê²ò·èÊýË¡¤Ï¡¢iostream ¥ª¥Ö¥¸¥§¥¯¥È¤ò 1 ¤Ä¤Î¥¹¥ì¥Ã¥É¤ËÂФ·¤Æ¶É½êŪ¤Ë¤·¤ÆÌäÂ꼫ÂΤò¤Ê¤¯¤·¤Æ¤·¤Þ¤¦¤³¤È¤Ç¤¹¡£¤½¤Î¤¿¤á¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ÊÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£

¤È¤³¤í¤¬Â¿¤¯¤Î¾ì¹ç (¤¿¤È¤¨¤Ð¥Ç¥Õ¥©¥ë¥È¤Î¶¦Í­É¸½à¥¹¥È¥ê¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ì¹ç)¡¢¥ª¥Ö¥¸¥§¥¯¥È¤òÆÃÄê¤Î¥¹¥ì¥Ã¥É¤Î¶É½ê¥ª¥Ö¥¸¥§¥¯¥È¤È¤¹¤ë¤³¤È¤¬ÉÔ²Äǽ¤Ç¡¢Â¾¤Î²ò·èºö¤òõ¤µ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£

iostream ¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ¹¤ë°ìÏ¢¤ÎÁàºî¤òÉÔ²Äʬ̿ÎáŪ¤Ë¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¤Ê¤ó¤é¤«¤Î¥í¥Ã¥¯¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥í¥Ã¥¯¤ò¹Ô¤¦¤È¡¢¥·¥ó¥°¥ë¥¹¥ì¥Ã¥ÉÍѤΥ¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¾ì¹ç¤Ç¤â¤¤¤¯¤é¤«¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬µ¯¤³¤ê¤Þ¤¹¡£¥í¥Ã¥¯¤ò»ÈÍѤ¹¤ë¤«¡¢¤¢¤ë¤¤¤Ï¡¢iostream ¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¹¥ì¥Ã¥É¤ÎÈó¸ø³«¥ª¥Ö¥¸¥§¥¯¥È¤È¤¹¤ë¤«¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÇºÎÍѤ·¤Æ¤¤¤ë¥¹¥ì¥Ã¥É¥â¥Ç¥ë¤Ë¤è¤ê¤Þ¤¹¡£

³Æ¥¹¥ì¥Ã¥É¤¬ÆÈΩ¤Î¾ì¹ç¤È¡¢Ê£¿ô¥¹¥ì¥Ã¥É¤¬¶¦Æ±ºî¶È¤ò¹Ô¤¦¾ì¹ç

stream_locker ¥¯¥é¥¹

iostream ¥é¥¤¥Ö¥é¥ê¤Ç¤Ï¡¢iostream ¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ¹¤ë°ìÏ¢¤ÎÁàºî¤ò¥í¥Ã¥¯¤¹¤ë¤¿¤á¤Î stream_locker ¥¯¥é¥¹¤¬Ä󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢iostream ¤Î¥í¥Ã¥¯¤È¥í¥Ã¥¯²ò½ü¤òưŪ¤ËÀßÄꤹ¤ë¤³¤È¤Ë¤è¤ë¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤òºÇ¾®¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

stream_locker ¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÈÍѤ¹¤ë¤È¡¢¥¹¥È¥ê¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ¹¤ë°ìÏ¢¤ÎÁàºî¤òÉÔ²Äʬ̿ÎáŪ¤Ë¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤¿¤È¤¨¤Ð¡¢¼¡¤ÎÎã¤Ç¤Ï¡¢¥Õ¥¡¥¤¥ëÆâ¤Î°ÌÃÖ¤ò»ØÄꤷ¤Æ¡¢¤½¤³¤«¤é¥Ç¡¼¥¿¤ò 1 ¥Ö¥í¥Ã¥¯Æɤ߹þ¤ß¤Þ¤¹¡£

¥³¡¼¥ÉÎã 4-10   ¥í¥Ã¥¯Áàºî¤ò»ÈÍѤ¹¤ëÎã
#include <fstream.h>
#include <rlocks.h>
void lock_example (fstream& fs)
{
    const int len = 128;
    char buf[len];
    int offset = 48;
    stream_locker s_lock(fs, stream_locker::lock_now);
    . . . . .// ¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó
    fs.seekg(offset, ios::beg);
    fs.read(buf, len);
}

¤³¤ÎÎã¤Ç¤Ï¡¢stream_locker ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤¬Áê¸ßÇÓ¾À©¸æ°è¤Î³«»Ï¤òÄêµÁ¤·¤Þ¤¹¡£Áê¸ßÇÓ¾À©¸æ°è¤Ç¤Ï¡¢°ìÅÙ¤Ë 1 ¤Ä¤Î¥¹¥ì¥Ã¥É¤·¤«¼Â¹Ô¤µ¤ì¤Þ¤»¤ó¡£¤Þ¤¿¡¢´Ø¿ô¤«¤éÌá¤Ã¤¿¸å¤Ç¸Æ¤Ó½Ð¤µ¤ì¤ë¥Ç¥¹¥È¥é¥¯¥¿¤Ç¤Ï¡¢Áê¸ßÇÓ¾À©¸æ°è¤Î½ªÎ»¤òÄêµÁ¤·¤Þ¤¹¡£¤·¤¿¤¬¤Ã¤Æ¡¢stream_locker ¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤è¤ê¡¢¥Õ¥¡¥¤¥ëÆâ¤ÎÆÃÄê¤Î°ÌÃ֤Υ·¡¼¥¯¤È¡¢¥Õ¥¡¥¤¥ë¤«¤é¤Î¥Ç¡¼¥¿¤ÎÆɤ߹þ¤ß¤È¤¬ÉÔ²Äʬ̿ÎáŪ¤Ë¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¥¹¥ì¥Ã¥É A ¤¬¥Õ¥¡¥¤¥ë¤«¤é¥Ç¡¼¥¿¤òÆɤ߹þ¤àÁ°¤Ë¡¢¥¹¥ì¥Ã¥É B ¤¬¥Õ¥¡¥¤¥ëÆâ¤Î°ÌÃÖ¤òÊѤ¨¤Æ¤·¤Þ¤¦¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤ë¤¿¤á¤Ç¤¹¡£

stream_locker ¥ª¥Ö¥¸¥§¥¯¥È¤Î¤â¤¦ 1 ¤Ä¤Î»ÈÍÑÊýË¡¤È¤·¤Æ¡¢Áê¸ßÇÓ¾À©¸æ°è¤òÌÀ¼¨Åª¤ËÄêµÁ¤¹¤ëÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¤Ï¡¢Æþ½ÐÎÏÁàºî¤È¤½¤ì¤Ë³¤¯¥¨¥é¡¼¸¡ºº¤òÉÔ²Äʬ̿ÎáŪ¤Ë¼Â¹Ô¤¹¤ë¤¿¤á¡¢stream_locker ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥á¥ó¥Ð¡¼´Ø¿ô lock ¤È unlock ¤ò¸Æ¤Ó½Ð¤·¤Þ¤¹¡£

¥³¡¼¥ÉÎã 4-11   Æþ½ÐÎÏÁàºî¤È¥¨¥é¡¼¸¡ºº¤òÉÔ²Äʬ̿ÎáŪ¤Ë¼Â¹Ô 
{
    ...
    stream_locker file_lck(openfile_stream,
                             stream_locker::lock_defer);
    ....
    file_lck.lock();  // openfile_stream ¤ò¥í¥Ã¥¯
    openfile_stream << "Value: " << int_value << "\n";
    if(!openfile_stream) {
    file_error("Output of value failed\n");
    		return;
    }
    file_lck.unlock();  // openfile_stream ¤Î¥í¥Ã¥¯¤ò²ò½ü
}

stream_locker ¤Ë¤Ä¤¤¤Æ¤Î¾ÜºÙ¤Ï¡¢stream_locker(3CC4) ¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£

¡ÖMT-°ÂÁ´¡×¤Î¥¯¥é¥¹

iostream ¥¯¥é¥¹¤«¤é¿·¤¿¤Ê¥¯¥é¥¹¤òÇÉÀ¸¤µ¤»¤Æ¡¢µ¡Ç½¤ò³ÈÄ¥¤·¤¿¤êÆü첽¤·¤¿¤ê¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ÇÉÀ¸¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶­¤Ç»ÈÍѤ¹¤ë¤È¤­¤Ï¡¢ÇÉÀ¸¥¯¥é¥¹¤â¡ÖMT-°ÂÁ´¡×¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£

¡ÖMT-°ÂÁ´¡×¤Î¥¯¥é¥¹¤òÇÉÀ¸¤¹¤ë¤È¤­¤Ë¤Ï¡¢¼¡¤ÎÅÀ¤ò¹Íθ¤·¤Æ¤¯¤À¤µ¤¤¡£

¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇË´þ

Ê£¿ô¤Î¥¹¥ì¥Ã¥É¤Ç¶¦Í­¤¹¤ë iostream ¥ª¥Ö¥¸¥§¥¯¥È¤òºï½ü¤¹¤ë¤È¤­¤Ï¡¢¤¹¤Ù¤Æ¤ÎÉû¥¹¥ì¥Ã¥É¤¬¤½¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î»ÈÍѤò½ªÎ»¤·¤Æ¤¤¤ë¤³¤È¤ò¡¢¼ç¥¹¥ì¥Ã¥É¤Ç³Îǧ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¼¡¤ÎÎã¤Ç¡¢¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤ò°ÂÁ´¤ËÇË´þ¤¹¤ëÊýË¡¤ò¼¨¤·¤Þ¤¹¡£

¥³¡¼¥ÉÎã 4-12   ¶¦Í­¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇË´þ  
#include <fstream.h>
#include <thread.h>
fstream* fp;

void *process_rtn(void*)
{
    // fp ¤ò»ÈÍѤ¹¤ëÉû¥¹¥ì¥Ã¥É¤ÎËÜÂÎ...
}

multi_process(const char* filename, int numthreads) 
{

  fp = new fstream(filename, ios::in);   // ¥¹¥ì¥Ã¥ÉÀ¸À®¤ÎÁ°¤Ë
    // fstream ¥ª¥Ö¥¸¥§¥¯¥È¤òÀ¸À®
    // ¥¹¥ì¥Ã¥É¤ÎÀ¸À®
    for (int i=0; i<numthreads; i++)
    thr_create(0, STACKSIZE, process_rtn, 0, 0, 0);


    // Á´¥¹¥ì¥Ã¥É¤Î½ªÎ»ÂÔ¤Á
    for (int i=0; i<numthreads; i++)
    thr_join(0, 0, 0);

    delete fp;                          // Á´¥¹¥ì¥Ã¥É¤Î½ªÎ»¸å¤Ë
    fp = NULL;                          // fstream ¥ª¥Ö¥¸¥§¥¯¥È¤òÇË´þ
}

¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î

¼¡¤ÎÎã¤Ç¤Ï¡¢Ê£¿ô¤Î¥¹¥ì¥Ã¥É¤ò»ÈÍѤ¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£¤³¤ÎÎã¤Ç¤Ï¡¢libC ¥é¥¤¥Ö¥é¥ê¤Î iostream ¥ª¥Ö¥¸¥§¥¯¥È¤ò¡ÖMT-°ÂÁ´¡×¤Ç»ÈÍѤ·¤Þ¤¹¡£

¤³¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢¥¹¥ì¥Ã¥É¤ò 255 ¸Ä¤Þ¤ÇºîÀ®¤·¤Þ¤¹¡£³Æ¥¹¥ì¥Ã¥É¤Ï¤½¤ì¤¾¤ì°Û¤Ê¤ëÆþÎÏ¥Õ¥¡¥¤¥ë¤«¤é°ìÅÙ¤Ë 1 ¹Ô¤º¤Ä¥Ç¡¼¥¿¤òÆɤ߹þ¤ß¡¢¤½¤Î¥Ç¡¼¥¿¤ò½ÐÎÏ¥Õ¥¡¥¤¥ë¤Ë½ñ¤­¹þ¤ß¤Þ¤¹¡£¤½¤Î¤È¤­É¸½à½ÐÎÏ¥¹¥È¥ê¡¼¥à cout ¤ò»ÈÍѤ·¤Þ¤¹¡£½ÐÎÏ¥Õ¥¡¥¤¥ë¤ÏÁ´¥¹¥ì¥Ã¥É¤Ç¶¦Í­¤¹¤ë¤¿¤á¡¢¤É¤Î¥¹¥ì¥Ã¥É¤«¤é½ÐÎϤµ¤ì¤¿¤«¤ò¼¨¤¹¥¿¥°¤òÉÕ¤±¤Þ¤¹¡£

¥³¡¼¥ÉÎã 4-13   iostream ¥ª¥Ö¥¸¥§¥¯¥È¤ò¡ÖMT-°ÂÁ´¡×¤Ç»ÈÍÑ 

 
// ¥¿¥°ÉÕ¤­¤Î¥¹¥ì¥Ã¥É¥Ç¡¼¥¿¤òÀ¸À®¡£
// ½ÐÎÏ¥Õ¥¡¥¤¥ë¤Î·Á¼°¤Ï <¥¿¥°><¥Ç¡¼¥¿¤Îʸ»úÎó>\n
// <¥¿¥°> ¤ÏÉä¹æ¤Ê¤·¤Î char ·¿¤ÎÀ°¿ôÃͤò¼¨¤¹¡£
// ¤³¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¼Â¹Ô¤Ç¤­¤ë¥¹¥ì¥Ã¥É¤Ï 255 ¸Ä¤Þ¤Ç¡£
// <¥Ç¡¼¥¿¤Îʸ»úÎó> ¤Ï½ÐÎϲÄǽ¤ÊǤ°Õ¤Îʸ»úÎó¤ò¼¨¤¹
// <¥¿¥°> ¤Ï char ·¿¤È¤·¤Æµ­½Ò¤µ¤ì¤¿À°¿ôÃͤʤΤǡ¢
// ½ÐÎÏ¥Õ¥¡¥¤¥ë¤ÎÆâÍƤò¸«¤ë¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Ë od ¤ò»ÈÍѤ¹¤ë¡£
//      od -c out.file |more

#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <fstream.h>
#include <thread.h>

struct thread_args {
  char* filename;
  int thread_tag;

};

const int thread_bufsize = 256;

// ³Æ¥¹¥ì¥Ã¥É¤Î¥¨¥ó¥È¥ê¥ë¡¼¥Á¥ó
void* ThreadDuties(void* v) {
// ¸½¥¹¥ì¥Ã¥É¤Î°ú¿ô¤Î¼èÆÀ
  thread_args* tt = (thread_args*)v;
  char ibuf[thread_bufsize];
  // ¥¹¥ì¥Ã¥É¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó
  ifstream instr(tt->filename);
  stream_locker lockout(cout, stream_locker::lock_defer);
  while(1) {
  // °ìÅÙ¤Ë 1 ¹Ô¤òÆɤ߹þ¤ß
    instr.getline(ibuf, thread_bufsize - 1, '\n');
    if(instr.eof())
      break;

 
// Æþ½ÐÎÏÁàºî¤òÉÔ²Äʬ̿ÎáŪ¤Ë¼Â¹Ô¤¹¤ë¤¿¤á¡¢ cout ¥¹¥È¥ê¡¼¥à¤ò¥í¥Ã¥¯
    lockout.lock(); 
  // ¥Ç¡¼¥¿¤Ë¥¿¥°¤òÉÕ¤±¤Æ cout ¤Ë½ÐÎÏ
    cout << (unsigned char)tt->thread_tag << ibuf << "\n";
    lockout.unlock();
  }
  return 0;
}

main(int argc, char** argv) {
  // argv: 1+ ³Æ¥¹¥ì¥Ã¥É¤Î¥Õ¥¡¥¤¥ë̾¥ê¥¹¥È
   if(argc < 2) {
     cout << "usage: " << argv[0] << " <files..>\n";
     exit(1);
   }
  int num_threads = argc - 1;
  int total_tags = 0;

// ¥¹¥ì¥Ã¥É ID ¤ÎÇÛÎó
  thread_t created_threads[thread_bufsize];
// ¥¹¥ì¥Ã¥É¤Î¥¨¥ó¥È¥ê¥ë¡¼¥Á¥ó¤Ø¤Î°ú¿ô¤ÎÇÛÎó
  thread_args thr_args[thread_bufsize];
  int i;
  for( i = 0; i < num_threads; i++) {
    thr_args[i].filename = argv[1 + i];
// ¥¹¥ì¥Ã¥É¤Ø¤Î¥¿¥°¤Î³ä¤êÅö¤Æ ¡Ý ¥¿¥°¤ÎÃÍ¤Ï 255 °Ê²¼
    thr_args[i].thread_tag = total_tags++;

 
// ¥¹¥ì¥Ã¥É¤ÎÀ¸À®
    thr_create(0, 0, ThreadDuties, &thr_args[i], 
           THR_SUSPENDED, &created_threads[i]);
  }

  for(i = 0; i < num_threads; i++) {
    thr_continue(created_threads[i]);
  }
  for(i = 0; i < num_threads; i++) {
    thr_join(created_threads[i], 0, 0);
  }
  return 0;
}


¥µ¥ó¡¦¥Þ¥¤¥¯¥í¥·¥¹¥Æ¥à¥º³ô¼°²ñ¼Ò
Copyright information. All rights reserved.
¥Û¡¼¥à   |   Ìܼ¡   |   Á°¥Ú¡¼¥¸¤Ø   |   ¼¡¥Ú¡¼¥¸¤Ø   |   º÷°ú