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
¥Ñ¥Ã¥±¡¼¥¸¤Î¥³¥¢¥¯¥é¥¹¤ò¼¨¤·¤Þ¤¹¡£
¡Ö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
¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤Ë¤Ï¡¢¥Þ¥ë¥Á¥¹¥ì¥Ã¥É´Ä¶¤Ç»ÈÍѤ·¤Æ¤â°ÂÁ´¤Ç¡¢¤«¤ÄºÆÆþ²Äǽ¤Ê¸ø³«´Ø¿ô¤¬¤¤¤¯¤Ä¤«Äɲ䵤ì¤Æ¤¤¤Þ¤¹¡£³Æ´Ø¿ô¤ÎÄɲðú¿ô¤È¤·¤Æ¡¢¥æ¡¼¥¶¡¼ÄêµÁ¥Ð¥Ã¥Õ¥¡¡¼¤ò»ØÄꤷ¤Þ¤¹¡£¼¡¤Ë´Ø¿ô¤ÎÆâÍƤò¼¨¤·¤Þ¤¹¡£
Ãí°Õ - µì¥Ð¡¼¥¸¥ç¥ó¤Î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-°ÂÁ´¡×¤Ë¤¹¤ë¤Ë¤Ï¡¢¼¡¤ÎÎã¤Î¤è¤¦¤Ë¡¢¥¨¥é¡¼¤òµ¯¤³¤¹¤è¤¦¤ÊÆþ½ÐÎÏÁàºî¤òȼ¤¦´í¸±Îΰè¤Ç¤Ï¡¢Æþ½ÐÎϤΥ¨¥é¡¼¤òÄ´¤Ù¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¤³¤ÎÎã¤Ç¤Ï¡¢
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 ¤Ä¤Î¥¹¥ì¥Ã¥É¤ËÂФ·¤Æ¶É½êŪ¤Ë¤·¤ÆÌäÂ꼫ÂΤò¤Ê¤¯¤·¤Æ¤·¤Þ¤¦¤³¤È¤Ç¤¹¡£¤½¤Î¤¿¤á¤Ë¤Ï¡¢¼¡¤Î¤è¤¦¤ÊÊýË¡¤¬¤¢¤ê¤Þ¤¹¡£
- ¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¹¥ì¥Ã¥É¤Î¥¨¥ó¥È¥ê´Ø¿ôÆâ¤Ç¶É½êŪ¤ËÀë¸À¤·¤Þ¤¹¡£
- ¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¹¥ì¥Ã¥É¸Çͥǡ¼¥¿Æâ¤ÇÀë¸À¤·¤Þ¤¹¡£¥¹¥ì¥Ã¥É¸Çͥǡ¼¥¿¤Î»ÈÍÑÊýË¡¤Ë¤Ä¤¤¤Æ¤Ï¡¢
thr_keycreate
(3T) ¤Î¥Þ¥Ë¥å¥¢¥ë¥Ú¡¼¥¸¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£- ¥¹¥È¥ê¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤òÆÃÄê¤Î¥¹¥ì¥Ã¥ÉÀìÍѤˤ·¤Þ¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¹¥ì¥Ã¥É¤Ïµ¬Â§¤Ë¤è¤êÈó¸ø³«¤Ë¤Ê¤ê¤Þ¤¹¡£
¤È¤³¤í¤¬Â¿¤¯¤Î¾ì¹ç (¤¿¤È¤¨¤Ð¥Ç¥Õ¥©¥ë¥È¤Î¶¦Íɸ½à¥¹¥È¥ê¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î¾ì¹ç)¡¢¥ª¥Ö¥¸¥§¥¯¥È¤òÆÃÄê¤Î¥¹¥ì¥Ã¥É¤Î¶É½ê¥ª¥Ö¥¸¥§¥¯¥È¤È¤¹¤ë¤³¤È¤¬ÉÔ²Äǽ¤Ç¡¢Â¾¤Î²ò·èºö¤òõ¤µ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
iostream
¥¯¥é¥¹¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ËÂФ¹¤ë°ìÏ¢¤ÎÁàºî¤òÉÔ²Äʬ̿ÎáŪ¤Ë¼Â¹Ô¤¹¤ë¤Ë¤Ï¡¢¤Ê¤ó¤é¤«¤Î¥í¥Ã¥¯¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥í¥Ã¥¯¤ò¹Ô¤¦¤È¡¢¥·¥ó¥°¥ë¥¹¥ì¥Ã¥ÉÍѤΥ¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¾ì¹ç¤Ç¤â¤¤¤¯¤é¤«¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬µ¯¤³¤ê¤Þ¤¹¡£¥í¥Ã¥¯¤ò»ÈÍѤ¹¤ë¤«¡¢¤¢¤ë¤¤¤Ï¡¢iostream
¥ª¥Ö¥¸¥§¥¯¥È¤ò¥¹¥ì¥Ã¥É¤ÎÈó¸ø³«¥ª¥Ö¥¸¥§¥¯¥È¤È¤¹¤ë¤«¤Ï¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ÇºÎÍѤ·¤Æ¤¤¤ë¥¹¥ì¥Ã¥É¥â¥Ç¥ë¤Ë¤è¤ê¤Þ¤¹¡£³Æ¥¹¥ì¥Ã¥É¤¬ÆÈΩ¤Î¾ì¹ç¤È¡¢Ê£¿ô¥¹¥ì¥Ã¥É¤¬¶¦Æ±ºî¶È¤ò¹Ô¤¦¾ì¹ç
- ¤½¤ì¤¾¤ì¤ÎÆÈΩ¤·¤¿¥¹¥ì¥Ã¥É¤¬¼«Ê¬¼«¿È¤Î
iostream
¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÈÍѤ·¤Æ¥Ç¡¼¥¿¤ÎÆþ½ÐÎϤò¹Ô¤¦¾ì¹ç¤Ï¡¢³Æ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-°ÂÁ´¡×¤Î¥¯¥é¥¹¤òÇÉÀ¸¤¹¤ë¤È¤¤Ë¤Ï¡¢¼¡¤ÎÅÀ¤ò¹Íθ¤·¤Æ¤¯¤À¤µ¤¤¡£
- ¥¯¥é¥¹¥ª¥Ö¥¸¥§¥¯¥È¤ò¡ÖMT-°ÂÁ´¡×¤Ë¤¹¤ë¤Ë¤Ï¡¢¥ª¥Ö¥¸¥§¥¯¥È¤ÎÆâÉô¾õÂÖ¤¬Ê£¿ô¤Î¥¹¥ì¥Ã¥É¤«¤éÊѹ¹¤µ¤ì¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£¤½¤Î¤¿¤á¤Ë¤Ï¡¢¸ø³«¤Ë¤Ê¤Ã¤Æ¤¤¤ë¥á¥ó¥Ð¡¼ÊÑ¿ô¤Ø¤Î¥¢¥¯¥»¥¹¡¢¤ª¤è¤ÓÁê¸ßÇÓ¾¥í¥Ã¥¯¤Ë¤è¤Ã¤ÆÊݸ¤ì¤Æ¤¤¤ë¥á¥ó¥Ð¡¼´Ø¿ô¤Ø¤Î¥¢¥¯¥»¥¹¤¬Ä¾Îó¤Ë¤Ê¤ë¤è¤¦¤Ë¤·¤Þ¤¹¡£
- ¡ÖMT-°ÂÁ´¡×¤Î´ðÄ쥯¥é¥¹¤Î¥á¥ó¥Ð¡¼´Ø¿ô¤ËÂФ¹¤ë¸Æ¤Ó½Ð¤·½ç¤òÉÔ²Äʬ¤Ë¤¹¤ë¤Ë¤Ï¡¢
stream_locker
¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÈÍѤ·¤Þ¤¹¡£- ¥í¥Ã¥¯¤Ëȼ¤¦¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤òÈò¤±¤ë¤Ë¤Ï¡¢
stream_locker
¥ª¥Ö¥¸¥§¥¯¥È¤ÇÄêµÁ¤µ¤ì¤¿´í¸±ÎΰèÆâ¤Ç¤Ï¡¢streambuf
¤Î¥á¥ó¥Ð¡¼´Ø¿ô¤Î¤¦¤Á_unlocked
¤Î¤â¤Î¤ò»ÈÍѤ·¤Þ¤¹¡£streambuf
¥¯¥é¥¹¤Î¸ø³«²¾ÁÛ´Ø¿ô¤¬¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤«¤éľÀܸƤӽФµ¤ì¤ë¾ì¹ç¤Ï¡¢¤½¤ì¤é¤Î´Ø¿ô¤ò¥í¥Ã¥¯¤·¤Þ¤¹ ¡£¤½¤Î¤è¤¦¤Ê´Ø¿ô¤È¤·¤Æ¤Ï¡¢xsgetn
¡¢underflow
¡¢pbackfail
¡¢xsputn
¡¢overflow
¡¢seekoff
¡¢seekpos
¤¬¤¢¤ê¤Þ¤¹¡£ios
¥ª¥Ö¥¸¥§¥¯¥È¤Î¥Õ¥©¡¼¥Þ¥Ã¥È¾õÂÖ¤ò³ÈÄ¥¤¹¤ë¤Ë¤Ï¡¢ios
¥¯¥é¥¹¤Î¥á¥ó¥Ð¡¼´Ø¿ôiword
¤Èpword
¤ò»ÈÍѤ·¤Þ¤¹¡£¤¿¤À¤·¡¢Ê£¿ô¤Î¥¹¥ì¥Ã¥É¤¬´Ø¿ôiword
¤Þ¤¿¤Ïpword
¤Ø¤ÎƱ¤¸¥¤¥ó¥Ç¥Ã¥¯¥¹¤ò¶¦Í¤¹¤ë¾ì¹ç¤ÏÌäÂ꤬µ¯¤³¤ê¤Þ¤¹¡£Ê£¿ô¤Î¥¹¥ì¥Ã¥É¤ò¡ÖMT-°ÂÁ´¡×¤Ë¤¹¤ë¤Ë¤Ï¡¢Å¬Àڤʥí¥Ã¥¯¤ò»ÈÍѤ·¤Æ¤¯¤À¤µ¤¤¡£char
·¿¤è¤ê¥µ¥¤¥º¤¬Â礤¤¥á¥ó¥Ð¡¼ÊÑ¿ô¤ÎÃͤòÊÖ¤¹¤è¤¦¤Ê¥á¥ó¥Ð¡¼´Ø¿ô¤Ï¡¢¥í¥Ã¥¯¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇË´þ
Ê£¿ô¤Î¥¹¥ì¥Ã¥É¤Ç¶¦Í¤¹¤ë
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. |
¥Û¡¼¥à | Ìܼ¡ | Á°¥Ú¡¼¥¸¤Ø | ¼¡¥Ú¡¼¥¸¤Ø | º÷°ú |