簡體   English   中英

從第二個線程不打印-帶互斥鎖的pthreads

[英]No prints from the second thread - pthreads with mutex locks

我寫:

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

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

int globalVarX;

void *threadFunction (void *arg)
{
    pthread_mutex_lock (&mutex1);

    while (globalVarX < 1000)
    {
        printf("x increment by thread id: %d", gettid ());
        ++globalVarX;
    }

    pthread_mutex_unlock (&mutex1);

    return NULL;
}

int main()
{
    pthread_t threadA;
    pthread_t threadB;

    if (pthread_create (&threadA, NULL, threadFunction, NULL)) 
    {
        fprintf (stderr, "Error creating thread\n");
        return 1;
    }

    if (pthread_create (&threadB, NULL, threadFunction, NULL)) 
    {
        fprintf (stderr, "Error creating thread\n");
        return 1;
    }

    if (pthread_join (threadA, NULL))
    {
        fprintf (stderr, "Error joining thread\n");
        return 2;
    }

    if (pthread_join (threadB, NULL))
    {
        fprintf (stderr, "Error joining thread\n");
        return 2;
    }

    return 0;
}

我得到的打印如下:

~/studies$ ./a.out 
x increment by thread id: 3154
x increment by thread id: 3154
x increment by thread id: 3154
x increment by thread id: 3154
x increment by thread id: 3154
x increment by thread id: 3154
x increment by thread id: 3154
x increment by thread id: 3154
x increment by thread id: 3154
x increment by thread id: 3154
~/studies$ 

未顯示來自其他線程的打印。

第一個線程將globalVarX遞增到1000 ,第二個線程無關。

我建議:

  • 鎖定一個增量而不是整個循環。

  • 也可以通過調用sched_yield()來給另一個線程增加增量的機會,因為如果一個線程在其時間片中將globalVarX增加到1000 ,則第二個線程仍然沒有打印輸出。

#include <pthread.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/syscall.h>
#include <unistd.h>

pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;

int globalVarX;

void *threadFunction (void *arg)
{
    int flagbreak = 0;

    for(;!flagbreak;) {
        pthread_mutex_lock (&mutex1);
        if (globalVarX >= 1000) flagbreak = 1;
        else {
            ++globalVarX;
            printf("x increment by thread id: %ld\n", syscall(SYS_gettid));
        }
        pthread_mutex_unlock (&mutex1);
        sched_yield();
    }
    return NULL;
}

int main(void)
{
    pthread_t threadA;
    pthread_t threadB;

    if (pthread_create (&threadA, NULL, threadFunction, NULL)) 
    {
        fprintf (stderr, "Error creating thread\n");
        return 1;
    }

    if (pthread_create (&threadB, NULL, threadFunction, NULL)) 
    {
        fprintf (stderr, "Error creating thread\n");
        return 1;
    }

    if (pthread_join (threadA, NULL))
    {
        fprintf (stderr, "Error joining thread\n");
        return 2;
    }

    if (pthread_join (threadB, NULL))
    {
        fprintf (stderr, "Error joining thread\n");
        return 2;
    }

    return 0;
}

要從概念上給兩個線程一個增加計數器的機會,請使用以下命令:

偽代碼:

Condition cond = condition_init;
Mutex mutex = mutex_init;

int counter = 0;

thread_func
{
  mutex_lock(mutex);

  while (counter < 1000)
  {
    ++counter;
    print thread, counter;
    condition_signal(cond);
    condition_wait(cond, mutex);
  }  

  condition_signal(cond);

  mutex_unlock(mutex);
}

main
{
  Thread thread_a = thread_create(thread_func);
  Thread thread_b = treadd_create(thread_func);

  thread_join(thread_a);
  thread_join(thread_b);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM