繁体   English   中英

在C中使用互斥锁和屏障进行线程同步

[英]Thread sync by using mutex and barrier in C

我正在尝试使用pthread互斥量变量和barrier来同步程序的输出,但是它并没有达到我想要的方式。 每个线程每20个值(来自for循环)就会看到其最终值,这很好,但是我正在尝试使它们都达到相同的最终值(如果使用5个线程,则它们都应将100视为最终值) ,具有4个线程,80个等)

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

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

int SharedVariable =0;
void *SimpleThread(void *args)
{
    int num,val,rc;
    int which =(int)args;
    rc = pthread_mutex_lock(&mutex1);
    for(num=0; num<20; num++){
#ifdef PTHREAD_SYNC
        if(random() > RAND_MAX / 2)
            usleep(10);
#endif
        //pthread_mutex_lock(&mutex1);
        val = SharedVariable;
        printf("*** thread %d sees value %d\n", which, val);
        //pthread_mutex_lock(&mutex1);
        SharedVariable = val+1;
        pthread_mutex_unlock(&mutex1);
    }   
    val=SharedVariable;

    printf("Thread %d sees final value %d\n", which, val);
    //pthread_mutex_destroy(&mutex1);
    //pthread_exit((void*) 0);
    //pthread_mutex_unlock(&mutex1);

}

int main (int argc, char *argv[])
{
   if(atoi(argv[1]) > 0){        
   int num_threads = atoi(argv[1]);  
   //pthread_mutex_init(&mutex1, NULL);
   pthread_t threads[num_threads];
   int rc;
   long t;
   rc = pthread_mutex_lock(&mutex1);
   for(t=0; t< num_threads; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, SimpleThread, (void* )t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }

    //pthread_join(thread1);

   }
    rc= pthread_mutex_unlock(&mutex1);
}
   else{
      printf("ERROR: The parameter should be a valid positive number.");
      exit(-1);
  }

   pthread_mutex_destroy(&mutex1);
   pthread_exit(NULL);
}

任何建议或帮助,我们将不胜感激! 提前致谢!

在检查最终值之前,您需要使用屏障( pthread_barrier_wait() )-这样可确保在所有线程到达屏障之前,不会有线程继续进行。

另外,您应该调用pthread_join()来等待线程完成,并且只需要在该增量附近保持互斥即可:

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

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_barrier_t barrier1;

int SharedVariable = 0;

void *SimpleThread(void *args)
{
    int num,val;
    int which = (int)args;

    for(num = 0; num < 20; num++) {
#ifdef PTHREAD_SYNC
        if(random() > RAND_MAX / 2)
            usleep(10);
#endif
        pthread_mutex_lock(&mutex1);
        val = SharedVariable;
        printf("*** thread %d sees value %d\n", which, val);
        SharedVariable = val + 1;
        pthread_mutex_unlock(&mutex1);
    }

    pthread_barrier_wait(&barrier1);

    val = SharedVariable;
    printf("Thread %d sees final value %d\n", which, val);
    return 0;
}

int main (int argc, char *argv[])
{
    int num_threads = argc > 1 ? atoi(argv[1]) : 0;

    if (num_threads > 0) {
        pthread_t threads[num_threads];
        int rc;
        long t;

        rc = pthread_barrier_init(&barrier1, NULL, num_threads);

        if (rc) {
            fprintf(stderr, "pthread_barrier_init: %s\n", strerror(rc));
            exit(1);
        }

        for (t = 0; t < num_threads; t++) {
            printf("In main: creating thread %ld\n", t);
            rc = pthread_create(&threads[t], NULL, SimpleThread, (void* )t);
            if (rc) {
                printf("ERROR; return code from pthread_create() is %d\n", rc);
                exit(-1);
            }
        }

        for (t = 0; t < num_threads; t++) {
            pthread_join(threads[t], NULL);
        }
    }
    else {
        printf("ERROR: The parameter should be a valid positive number.\n");
        exit(-1);
    }

    return 0;
}

尝试将pthread_mutext_unlock(&mutext1)SimpleThread移出for循环。 您只需在原始代码中锁定一次并解锁多次(20)。

另外,您可以在读取和修改SharedVariable之前将pthread_mutex_lock(&mutext1)移到for循环中。 在这种情况下,每个线程的add-by-one运算可能不连续,但每个线程将获得正确的最终值。

并且在读取SharedVariable的最终值SharedVariable ,请使用屏障来等待所有线程完成其工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM