c++ - P线程问题

标签 c++ c multithreading pthreads mutex

我正在尝试制作一个小线程示例。我想要一个变量,每个线程都尝试递增它,然后在达到某个点后停止。每当变量被锁定时,我希望打印出某种消息,如“线程 x 试图锁定,但不能”,以便我知道它工作正常。这是我第一天编写线程,所以请随时指出代码中任何不必要的地方 -

#include <iostream>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

#define NUM_THREADS 2
pthread_t threads[NUM_THREADS];
pthread_mutex_t mutexsum;

int NUMBER = 0;
void* increaseByHundred(void* threadid) {

    if(pthread_mutex_lock(&mutexsum))
        cout<<"\nTHREAD "<<(int)threadid<<" TRYING TO LOCK BUT CANNOT";

    else {
        for(int i=0;i<100;i++) {
            NUMBER++;
            cout<<"\nNUMBER: "<<NUMBER;
        }
        pthread_mutex_unlock(&mutexsum);
        pthread_exit((void*)0);
    }
}


int main(int argc, char** argv) {

    int rc;
    int rc1;
    void* status;

    pthread_attr_t attr;

    pthread_mutex_init(&mutexsum, NULL);
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    rc = pthread_create(&threads[0], &attr, increaseByHundred, (void*)0);
    rc1 = pthread_create(&threads[1], &attr, increaseByHundred, (void*)1);

    pthread_attr_destroy(&attr);

    while(NUMBER < 400)
        pthread_join(threads[0], &status);


    pthread_mutex_destroy(&mutexsum);
    pthread_exit(NULL);

}

我正在按照此处找到的教程进行操作 https://computing.llnl.gov/tutorials...reatingThreads 并尝试使他们的互斥锁示例适应这个想法。代码将其递增到 199,然后停止。我猜是因为线程只执行一次例行程序。有没有办法让他们只做他们的例行公事,而不是在你创建他们的时候,所以我可以说

当某事 做你的日常 ?

我在那里有 pthread_join 只是因为它与他们的教程中的内容相似。不过,我什至不太清楚。我很确定那条线是问题所在……我只是不知道如何解决。任何帮助表示赞赏。

最佳答案

Whenever the variable is locked, I want some sort of message to be printed out like "thread x trying to lock, but cannot" so that I KNOW it's working correctly.

你为什么想要那个?您只是在学习线程。先学习基础知识。不要深入研究 pthread_mutex_trylock 或为错误检查配置的互斥体。在学习如何运行之前,您需要先学会走路。

基础知识涉及使用默认设置初始化的互斥锁,并使用 pthread_mutex_lock 获取锁。使用默认设置,pthread_mutex_lock 只会在出现非常大的问题时返回非零值。这里只会出现两个问题:死锁和错误的互斥指针。两者都无法恢复;唯一真正的解决方案是修复代码。您在这里唯一可以做的就是抛出您没有捕获的异常,调用 exit() 或 abort() 等。

其他线程锁定了互斥量不是大问题。这根本不是问题。 pthread_mutex_lock 将阻塞(例如,进入休眠状态)直到锁可用。 pthread_mutex_lock 的零返回意味着调用线程现在拥有锁。只需确保在使用完 protected 内存后释放锁定即可。

编辑
这里有一个建议,可以让您了解线程机制是否像宣传的那样工作。

  1. 在进入 increaseByHundred 时打印一 strip 时间戳的消息,指示进入该函数。您可能希望在此处使用 C printf 而不是 C++ I/O。 printf() 和相关函数是线程安全的。 C++ 2003 I/O 不是。
  2. pthread_mutex_lock 成功返回后,打印另一 strip 时间戳的消息,表明锁定成功。
  3. sleep() 几秒钟,然后在调用 pthread_mutex_unlock() 之前打印另一 strip 时间戳的消息。
  4. 在调用 pthread_exit() 之前执行相同的操作。

最后一条评论:您正在检查从 pthread_mutex_lock 返回的错误。为了完整起见,并且因为每个优秀的程序员都对所有问题都感到疑惑,所以您还应该检查 pthread_mutex_unlock 的返回状态。

pthread_exit 怎么样?它没有返回状态。您可以在调用 pthread_exit 后打印一些消息,但如果您使用的是线程库的非兼容版本,您将只会到达该语句。函数 pthread_exit() 无法返回调用函数。时期。担心 pthreads_exit() 返回时会发生什么是锡纸帽练习。虽然优秀的程序员应该是偏执狂,但他们不应该是偏执的精神 split 症患者。

关于c++ - P线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6549342/

相关文章:

c++ - 使用 Eigen C++ 库求逆矩阵 mod-26

c++ - 在 QT C++ 中的 QSystemTrayIcon 附近显示 QWidget 或 QWindow

c - OpenSSL 上的 AES CTR 256 加密操作模式

c - 如何使用 `strtoul` 解析零可能有效的字符串?

c - 使用 int 变量作为 char 变量可以吗?

c openmp parallel for inside a parallel region

java - 构造期间的线程安全

c++ - 为什么不自动假定#pragma 一次?

android - AsyncTask 需要很长时间才能进入 doInBackground()

c++ - 为什么重复继承/重复继承无效?