- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用尝试锁:
FILE *fp;
pthread_mutex_t demoMutex;
void * printHello (void* threadId)
{
pthread_mutex_trylock (&demoMutex);
pthread_t writeToFile = pthread_self ();
unsigned short iterate;
for (iterate = 0; iterate < 10000; iterate++)
{
fprintf (fp, " %d ", iterate, 4);
fprintf (fp, " %lu ", writeToFile, sizeof (pthread_t));
fprintf (fp, "\n", writeToFile, 1);
}
pthread_mutex_unlock (&demoMutex);
pthread_exit (NULL);
}
然后是main():
int main ()
{
pthread_t arrayOfThreadId [5];
int returnValue;
unsigned int iterate;
fp = fopen ("xyz", "w");
pthread_mutex_init (&demoMutex, NULL);
for (iterate = 0; iterate < 5; iterate++)
{
if (returnValue = pthread_create (&arrayOfThreadId [iterate],
NULL,
printHello,
(void*) &arrayOfThreadId [iterate]) != 0)
{
printf ("\nerror: pthread_create failed with error number %d", returnValue);
}
}
for (iterate = 0; iterate < 5; iterate++)
pthread_join (arrayOfThreadId [iterate], NULL);
return 0;
}
这里的输出首先打印第一个线程的一些内容,然后是其余的,然后再次是第一个。锁坏了。如果我用 pthread_mutex_lock
替换它,那么每件事都会按顺序显示!
这里有什么可笑的错误?
最佳答案
不测试结果就调用pthread_mutex_trylock()
是没有意义的。
如果它无法获取互斥锁,您不应该进入临界区,您以后也不应该解锁它。例如,您可以这样重写它(请注意,您也对如何调用 fprintf()
感到很困惑):
void *printHello(void *threadId)
{
if (pthread_mutex_trylock(&demoMutex) == 0)
{
unsigned short iterate;
for (iterate = 0; iterate < 10000; iterate++)
{
fprintf (fp, " %d\n", iterate);
}
pthread_mutex_unlock (&demoMutex);
}
pthread_exit (NULL);
}
但是,使用 pthread_mutex_lock()
而不是 pthread_mutex_trylock()
可能更有意义,这样您的线程将等待互斥体可用(如果它可用)争论。 pthread_mutex_lock()
几乎在所有情况下都是您想要的; _trylock
变体仅用于优化一些异常情况 - 如果您遇到需要 _trylock
的情况,您就会知道。
关于c - 如何使用pthread_mutex_trylock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9258308/
我花了一周的时间来修复一个程序,一开始我得到了SIGBUS,但经过多次尝试后程序仍然得到了SIGSEGV段错误,在下面我发布了段错误日志+源代码。如果专家帮助我修复此段错误错误,我将非常感激。任何建议
我正在使用 pthread_mutex_trylock 将互斥锁锁定在一个结构上,以便它只能在给定时间由单个线程访问/修改。如果互斥体已经被锁定,我只是从例程返回而不是排队/阻塞。 这是我的代码的基本
在我的代码中,我使用 pthread_mutx_trylock() 来检查线程 1 是否已完成他的任务工作并释放互斥锁吗?请让我知道它是否有效? 在线程 1 中: pthread_mutex
/////////////////////////////////* pthread_mutex_t stop = PTHREAD_MUTEX_INITIALIZER; int a = 1; void
我正在学习在 Linux 编程中使用互斥量。我遇到了 trylock 函数,它首先检查互斥量是否可用,否则将其锁定,然后返回。 现在我的问题是: 调用trylock时,是否在未执行临界区的情况下到达函
最近看了memcached的源码,在文件 memcached.h 中。我找到了这段代码: static inline int mutex_lock(pthread_mutex_t *mutex) {
我有以下测试程序。 #include #include using namespace std; pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIA
pthread_mutex_trylock 检测死锁,不阻塞,那你为什么“需要” pthread_mutex_lock? 也许当你故意想让线程阻塞?但那样的话可能会导致死锁? 最佳答案 pthread
一旦线程被取消,就需要解锁互斥体,以避免死锁。所以我设计了以下方法: // file_a.c pthread_attr_t attr; ... rc2 = pthread_attr_init(&att
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
这是对 this 的跟进问题。 在该代码中,当我不使用 fflush(stdout) 时,当我保持 sleep(1) 时,输出不会刷新到屏幕上。 #define S sleep(0) void* xT
我是一名优秀的程序员,十分优秀!