Linux線程同步(條件變量和信號量)

題目要求:

The outputshould be:

from thread 10

from thread 9

from thread 8

from thread 7

from thread 6

from thread 5

from thread 4

from thread 3

from thread 2

from thread 1

   Do this using one mutex, one condition variable and thepthread_cond_broadcast function call. You can use global variables, like globalintegers etc.  Please only modify thefunc()function, do not modify the mainfunction except for initializing condition variables and mutexes.


源文件如下所示:

#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>
#include <stdlib.h>

void * func(void * arg)
{

    printf("from thread %d\n", (int)arg);

    return (NULL);
}

int main(int argc, char* argv[]) {
    int n,i;
    pthread_t threads[10];
    
    for (i = 0; i < 10; i++) {
      pthread_create(&threads[i], NULL, func, (void*)i+1);  
    }

    for (i = 0; i < 10; i++) {
      pthread_join(threads[i], NULL);  
    }

    exit(1);
}


用條件變量方式修改成功後代碼如下:

#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>
#include <stdlib.h>

pthread_mutex_t mutex;
pthread_cond_t cond;
int word = 10;

void * func(void * arg)
{
	pthread_mutex_lock(&mutex);
	sleep(1);
	if(word != (int)arg)
	{
		pthread_cond_wait(&cond,&mutex);
	}
	while(word >= 1)
	{
		if(word == (int)arg)
		{
			printf("from thread %d\n", (int)arg);
			word--;
			pthread_cond_broadcast(&cond);
		}
		else
			pthread_cond_wait(&cond,&mutex);
	}
	pthread_mutex_unlock(&mutex);
    return(NULL);
}

int main(int argc, char* argv[]) {
    int n,i;
    pthread_t threads[10];
    pthread_mutex_init(&mutex,NULL);	//initialization condition variable
	pthread_cond_init(&cond,NULL);

    for (i = 0; i < 10; i++) {
      pthread_create(&threads[i], NULL, func, (void*)i+1);  
    }

    for (i = 0; i < 10; i++) {
      pthread_join(threads[i], NULL);  
    }

    exit(1);
}

用信號量方式修改成功後的源碼:

#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>
#include <stdlib.h>
#include <semaphore.h>

sem_t sem[10];
void *func(void * arg)
{
	sleep(1);
	if((int)arg >= 1)
	{
		if(sem_wait(&sem[(int)arg-1])== 0)
		{
			printf("from thread %d\n", (int)arg);
			sem_post(&sem[(int)arg-2]);
		}
	}
    return (NULL);
}

int main(int argc, char* argv[]) {
    int n,i;
    pthread_t threads[10];
	for(i=0;i<9;i++)
		sem_init(&sem[i],0,0);
	sem_init(&sem[9],0,1);

    for (i = 0; i < 10; i++) {
      pthread_create(&threads[i], NULL, func, (void*)i+1);  
    }
    for (i = 0; i < 10; i++) {
      pthread_join(threads[i], NULL);  
    }

    exit(1);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章