【问题标题】:Can't tell if Mutex Lock is kicking in or not?无法判断 Mutex Lock 是否启动?
【发布时间】:2020-11-11 11:44:32
【问题描述】:

我正在完成一项大学作业,我的任务是展示一个基本的互斥锁示例。我从来没有使用过任何形式的线程,所以我是一个在 C++ 中使用 POSIX 线程的初学者。

我想让程序做的是创建 1000 个线程,将全局整数增加 1000。

#include        <iostream>
#include    <stdlib.h>
#include    <pthread.h>
#include    <sys/types.h>
#include    <unistd.h>
#include    <thread>

pthread_t   threadArr[1000];
pthread_mutex_t lock;

// Global int to increment
int numberToInc = 0;

void* incByTwo(void*)
{
    pthread_mutex_lock(&lock);
    for(int j = 0; j < 1000; j++){
        numberToInc += 1;
    }
    pthread_mutex_unlock(&lock);
    return NULL;
}

int main()
{
    //Creates 1000 threads with incByTwo func
    for(int i = 0; i < 1000; i++){
        pthread_create(&threadArr[i], NULL, incByTwo, NULL);
    }


    std::cout << "\n" << numberToInc << "\n";

    

    return 0;
}

下面会产生一系列不同的结果,显然是因为线程是并发执行的,对吧?

现在,我通过插入使其正常工作

    for(int i = 0; i < 1000; i++){
        pthread_join(threadArr[i], NULL);
    }

在线程创建循环之后,但随后删除互斥锁,它仍然有效。我一直在试图弄清楚 pthread_join 是如何工作的,但我有点迷茫。有什么建议吗?

【问题讨论】:

  • 如果您仍然使用原始 POSIX 库,为什么还要使用 C++?
  • 正在使用我用来研究操作系统中线程的书中提供的线程示例。他们都提供了使用 pthread 的示例,但我想提供我自己的示例。
  • 创建一个线程需要一段时间,因此在创建下一个线程之前,第一个线程可能已经完成。将sleep 放在incByTwo 的开头。
  • 是的,join 是必需的,否则 main 会在你的 1000 个线程完成之前完成,你每次都会得到意想不到的部分结果
  • 添加睡眠肯定有帮助,那么这是否是一个糟糕的实际示例来展示互斥锁是如何工作的,因为 sleep() 调用允许它在没有锁到位的情况下产生相同的结果?

标签: c++ multithreading pthreads mutex


【解决方案1】:

排序了一种显示互斥锁的方式。因此,当我在函数中输出全局 var 时,如果没有互斥锁,它可能会乱序显示结果。

使用互斥锁运行数字范围,结果如下:

1000
2000
3000
... (etc)
10000

移除互斥锁后,输出的顺序可能会有所不同。

例如

1000
2000
4000
6000
3000
5000
7000
8000
9000
10000

虽然三个线程的最终结果是正确的,但顺序是乱序的。在这个程序的上下文中,这并不重要,但我想如果它传递的序列值不一致,它会搞砸吗?

pthread_t   threadArr[10];
pthread_mutex_t lock;

int numberToInc = 0;


void* incByTwo(void*)
{

    pthread_mutex_lock(&lock);
    for(int j = 0; j < 1000; j++){
        numberToInc += 1;
    }

    std::cout << numberToInc << "\n";
    pthread_mutex_unlock(&lock); 
    return NULL;
}

int main()
{

    if (pthread_mutex_init(&lock, NULL) != 0)
    {
            printf("\n mutex init failed\n");
            return 1;
        }

    for(int i = 0; i < 10; i++){
        pthread_create(&threadArr[i], NULL, incByTwo, NULL);
    }
    
    pthread_join(threadArr[0], NULL);

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多