我正在尝试制作一个小线程示例。我想要一个变量,每个线程都尝试递增它,然后在达到某个点后停止。每当变量被锁定时,我希望打印出某种消息,如“线程 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 内存后释放锁定即可。
编辑
这里有一个建议,可以让您了解线程机制是否像宣传的那样工作。
- 在进入
increaseByHundred
时打印一 strip 时间戳的消息,指示进入该函数。您可能希望在此处使用 Cprintf
而不是 C++ I/O。printf()
和相关函数是线程安全的。 C++ 2003 I/O 不是。 - 从
pthread_mutex_lock
成功返回后,打印另一 strip 时间戳的消息,表明锁定成功。 sleep()
几秒钟,然后在调用pthread_mutex_unlock()
之前打印另一 strip 时间戳的消息。- 在调用
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/