【问题标题】:POSIX C Threads. Mutex example. Don't work as expectedPOSIX C 线程。互斥体示例。不按预期工作
【发布时间】:2012-04-27 00:47:55
【问题描述】:

我有一个大问题,我不明白为什么 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 解锁互斥锁。但是我收到了像

这样的干扰消息

函数 功能 功能 另一个函数 另一个函数 另一个函数 功能 另一个函数

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

【问题讨论】:

    标签: c multithreading mutex multitasking


    【解决方案1】:
    pthread_create(&mythread, NULL, func, NULL);
    pthread_create(&mythread, NULL, anotherFunc, NULL);
    
    pthread_mutex_destroy(&mymutex);
    

    您正在销毁互斥体线程完成之前,所以所有的赌注都没有了。在销毁 2 个线程之前,您可能需要 pthread_join

    【讨论】:

    • 我认为它有效 :) 这是我为任何感兴趣的人提供的最终代码...pastebin.me/bc23773578d79a55882d7ced4e04b026
    • 还是坏了。只有在销毁互斥锁​​时,才能确保 一个 线程已完成。如果另一个还没有完成呢?除非您以某种方式强制执行,否则无法保证线程将以任何特定顺序启动、获取互斥锁或完成。 (多线程的第一课是这样的:只有当你强制它们以特定的顺序发生时,才能确保它们以特定的顺序发生。)
    • 是的,但是我在一个线程中启动了两个函数,唯一的线程:mythread。这样做是否可以,或者使用一个线程执行一个功能总是更安全?
    • 无论如何,我爱你们,你们太快了,我已经有一段时间没有为这个问题苦苦挣扎了。我总是忽略主线程。
    • @JohnSmith 只要确保你加入了两个线程,否则你可能会破坏互斥锁,而另一个线程仍将其锁定。
    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-28
      • 1970-01-01
      • 2013-02-11
      • 1970-01-01
      • 2016-12-27
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多