8

我有一个大问题,我不明白为什么 C 中的互斥锁不能按我的预期工作。这是我的代码:

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

pthread_t mythread;
pthread_mutex_t mymutex;

void *anotherFunc(void*)
{
    pthread_mutex_lock(&mymutex);

    for(int i = 0; i < 100; i++)
        printf("anotherFunc\n");

    pthread_mutex_unlock(&mymutex);

    pthread_exit(NULL);
}

void *func(void*)
{
    pthread_mutex_lock(&mymutex);

    for(int i = 0; i < 100; i++)
        printf("func\n");

    pthread_mutex_unlock(&mymutex);

    pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
    pthread_mutex_init(&mymutex, NULL);

    pthread_create(&mythread, NULL, func, NULL);
    pthread_create(&mythread, NULL, anotherFunc, NULL);

    pthread_mutex_destroy(&mymutex);

    pthread_exit(NULL);
    return EXIT_SUCCESS;
}

我期望发生的是程序先打印 100 条“func”消息,然后再打印 100 条“anotherFunc”消息。我期望的是执行到达 func 并锁定互斥锁。当执行到达 anotherFunc 时,我希望等到 func 解锁互斥锁。但我收到干扰消息,例如

func func func anotherFunc anotherFunc anotherFunc func anotherFunc

我不明白这东西是如何工作的。请帮忙!

4

2 回答 2

16
pthread_create(&mythread, NULL, func, NULL);
pthread_create(&mythread, NULL, anotherFunc, NULL);

pthread_mutex_destroy(&mymutex);

你在线程完成之前破坏了互斥锁,所以所有的赌注都没有了。在销毁它之前,您可能需要pthread_join2 个线程。

于 2012-04-15T11:04:47.850 回答
2

我有几个编译错误

  • 我无法在for循环中声明int i

  • 使用参数名称arg作为线程“func”和“anotherFunc”的参数

我在销毁互斥锁​​之前使用了 pthread_join 。

这样,在线程“func”和“anotherFunc”都完成执行后,我正在销毁我的互斥锁“mymutex”

此外,每个线程现在都有自己的线程 ID “mythread1”“mythread2”,所以这样我可以为每个线程使用 pthread_join() 函数

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

pthread_t mythread1, mythread2;
pthread_mutex_t mymutex;

void *anotherFunc(void *arg)
{
    pthread_mutex_lock(&mymutex);
    int i;

    for(i = 0; i < 100; i++)
        printf("anotherFunc\n");

    pthread_mutex_unlock(&mymutex);

    pthread_exit(NULL);
}

void *func(void *arg)
{
    pthread_mutex_lock(&mymutex);
    int i;
    for(i = 0; i < 100; i++)
        printf("func\n");

    pthread_mutex_unlock(&mymutex);

    pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
    pthread_mutex_init(&mymutex, NULL);

    pthread_create(&mythread1, NULL, func, NULL);
    pthread_create(&mythread2, NULL, anotherFunc, NULL);


    pthread_join(mythread1, NULL);
    pthread_join(mythread2, NULL);

    pthread_mutex_destroy(&mymutex);

   return EXIT_SUCCESS;
}
于 2014-12-11T07:00:21.507 回答