<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    嵌入式 互斥鎖和讀寫鎖區別

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接  
    1. /*
    2.  * 線程同步——互斥量
    3.  * 創建兩個線程,使用互斥量使任一時刻只有一個線程對全局變量進行
    4. 操作
    5.  * Lzy 2011-6-19
    6.  */
    7. #include <stdio.h>
    8. #include <stdlib.h>
    9. #include <pthread.h>
    10. pthread_mutex_t mutex;                    /* 定義
    11. 互斥量 */
    12. int x;                                
    13.     /* 定義全局變量 */
    14. void thread1(void)                /* 定義線程1運
    15. 行的函數,其功能是對全局變量x進行逐減操作 */
    16. {
    17.   while(x>0)
    18.   {
    19.     pthread_mutex_lock(&mutex);            /* 對互斥量進行
    20. 加鎖操作 */
    21.     printf("Thread 1 is running : x=%d \n",x);
    22.     x--;
    23.     pthread_mutex_unlock(&mutex);        /* 對互斥量進行
    24. 解鎖操作 */
    25.     sleep(1);
    26.   }
    27.   pthread_exit(NULL);
    28. }
    29. void thread2(void)                /* 定義線程2運
    30. 行的函數,功能與thread2相同 */
    31. {
    32.   while(x>0)
    33.   {
    34.     pthread_mutex_lock(&mutex);            /* 對互斥量進行
    35. 加鎖操作 */
    36.     printf("Thread 2 is running : x=%d \n",x);
    37.     x--;
    38.     pthread_mutex_unlock(&mutex);        /* 對互斥量進行
    39. 解鎖操作 */
    40.     sleep(1);
    41.   }
    42.   pthread_exit(NULL);
    43. }
    44. int main(void)
    45. {
    46.   pthread_t id1,id2;                        
    47. /* 定義線程的標識符 */
    48.   int ret;
    49.   ret = pthread_mutex_init(&mutex,NULL);    /* 對互斥量進行
    50. 初始化,這里使用默認的屬性 */
    51.   if(ret != 0)
    52.   {
    53.     printf ("Mutex initialization failed.\n");        /* 如果
    54. 初始化失敗,打印錯誤信息 */
    55.     exit (1);
    56.   }
    57.   x=10;                                
    58. /* 對全局變量賦初值 */
    59.   ret = pthread_create(&id1, NULL, (void *)&thread1, NULL);    
    60.     /* 創建線程1 */
    61.   if(ret != 0)
    62.   {
    63.     printf ("Thread1 creation failed.\n");
    64.     exit (1);
    65.   }
    66.   ret = pthread_create(&id2, NULL, (void *)&thread2, NULL);    
    67.     /* 創建線程2 */
    68.   if(ret != 0)
    69.   {
    70.     printf ("Thread2 creation failed.\n");
    71.     exit (1);
    72.   }
    73.   pthread_join(id1, NULL);                /*線程
    74. 合并 */
    75.   pthread_join(id2, NULL);
    76.   return (0);
    77. }
    1. /*
    2.  * 線程同步
    3.  * ——讀寫鎖 
    4.  *     只要沒有進程持有某個給定的讀寫鎖用于寫,那么任意數目的
    5. 線程都可持有該讀寫鎖用于讀
    6.  *     僅當沒有線程持有某個給定的讀寫鎖用于讀或寫,才能分配該
    7. 讀寫鎖用于寫。
    8.  * Lzy 2011-6-19
    9.  */
    10. #include <stdio.h>
    11. #include <stdlib.h>
    12. #include <pthread.h>
    13. int product = 0;        //定義全局變量
    14. pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;    //靜態
    15. 初始化讀寫鎖    
    16. void * threadRead(void * arg)            //線程函數讀 
    17. {
    18.     int cnt = 0;
    19.     while(cnt++ < 100)
    20.     {
    21.         pthread_rwlock_rdlock(&rwlock);    //讀鎖
    22.         
    23.         printf("Read: product = %d\n", product);
    24.         
    25.         pthread_rwlock_unlock(&rwlock);    //解鎖
    26.         sleep(1);
    27.     }
    28. }
    29. void * tidProduce(void * arg)    //線程函數寫 加1
    30. {
    31.     int cnt = 0;
    32.     while(cnt++ < 100)
    33.     {
    34.         pthread_rwlock_wrlock(&rwlock);    //寫鎖
    35.         
    36.         product++;
    37.         printf("Produce: product = %d\n", product);
    38.         
    39.         pthread_rwlock_unlock(&rwlock);    //解鎖
    40.         sleep(1);
    41.     }
    42. }
    43. void * threadConsume(void * arg)    //線程函數寫 減1
    44. {
    45.     int cnt = 0;
    46.     while(cnt++ < 100)
    47.     {
    48.         pthread_rwlock_wrlock(&rwlock);    //寫鎖
    49.         
    50.         product--;
    51.         printf("Consume: product = %d\n", product);
    52.         
    53.         pthread_rwlock_unlock(&rwlock);    //解鎖
    54.         sleep(2);
    55.     }
    56. }
    57. int main(void)
    58. {
    59.     int i;
    60.     pthread_t tid[10], tidconsume, tidproduce;
    61.     
    62.     for(i = 0; i < 2; i++)
    63.     {
    64.         if(pthread_create(&tid[i], NULL, threadRead, 
    65. NULL))
    66.         {
    67.             printf("pthread_create error\n");
    68.             exit(0);
    69.         }
    70.     }
    71.     if(pthread_create(&tidproduce, NULL, tidProduce, NULL))
    72.     {
    73.         printf("pthread_create error\n");
    74.         exit(0);
    75.     }
    76.     if(pthread_create(&tidconsume, NULL, threadConsume, 
    77. NULL))
    78.     {
    79.         printf("pthread_create error\n");
    80.         exit(0);
    81.     }
    82.     pthread_exit(NULL);        //等待所有線程結束 
    83.     return 0;
    84. }
    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全