1. 程式人生 > >Linux關於執行緒同步

Linux關於執行緒同步

關於執行緒的瞭解,可以閱讀前一篇文章《Linux關於多執行緒》,瞭解執行緒後,閱讀本文章會比較容易

以下程式碼是想讓一個執行緒count進行累加,另一邊讀出來,每次累加就讀出來一次

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>

int count = 0;

void *thr1(void *arg)
{
    while(1)
    {
       sleep(1);
       count+=10;
    }
}

void *thr2(void *arg)
{
    while(1)
    {
        printf("%d\n",count);
    }
}

int main()
{
    pthread_t tid1,tid2;
    pthread_create(&tid1,NULL,thr1,NULL);
    pthread_create(&tid2,NULL,thr2,NULL);

    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
}

但是實際結果卻不是這樣的,會無限迴圈,兩個執行緒不會進行同步

下面我們使用訊號量,進行PV操作,讓執行緒進行同步

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<stdlib.h>
#include <semaphore.h>

sem_t sem;
int count = 0;

void *thr1(void *arg)
{
    while(1)
    {
       sleep(1);
       sem_post(&sem);//V操作
       count+=10;
    }
}

void *thr2(void *arg)
{
    while(1)
    {
        sem_wait(&sem);//P操作
        printf("%d\n",count);
    }
}

int main()
{
    pthread_t tid1,tid2;
    pthread_create(&tid1,NULL,thr1,NULL);
    pthread_create(&tid2,NULL,thr2,NULL);

    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
}

結果如下:實現執行緒同步