- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
干杯,
我有 2 个线程导致逻辑死锁 => d_santa 和 d_patuljak(抱歉有些文章是用克罗地亚语写的,我没有时间翻译)
d_santa 这样做
void d_santa(){ //dodati join!!!
int j;
pthread_mutex_lock(&m);
while(1){
pthread_cond_wait(&u_santa,&m);
if ((br_sob==10)&&(br_patuljak)){
printf ("Dajem poklone i rijesavam se sobova\n");
pthread_cond_broadcast(&u_sob);
sleep(2);
for (j=2; j<=11; j++){
printf ("Pokusavam brisat sob na %d\n",j);
pthread_join(thred[j],NULL);
br_sob--;
printf ("broj sobova=%d\n",br_sob);
}
}
if (br_sob==10){
printf("Hrani nezahvalnu bagru\n");
sleep(2);
}
if ((br_patuljak%3)==0){
pthread_cond_broadcast(&u_patuljak);
printf ("Rijesi problem patuljaka\n");
sleep(1);
for (j=0; j<3; j++){
br_ulaz++;
printf("Oslobađam dretvu %d\n",H_ULAZ);
pthread_join(thred[H_ULAZ],NULL);
br_patuljak--;
}
}
}
pthread_mutex_unlock(&m);
}
d_patuljak 会这样做
void d_patuljak(){ //zavrsi implementaciju proizvodac potrosac
pthread_mutex_lock(&m);
br_patuljak++;
printf ("Nastao je patuljak %d\n",br_patuljak);
while(br_patuljak<3){
pthread_cond_wait(&u_patuljak,&m);
}
printf ("Patuljak se oslobodio\n");
if (br_patuljak==3){
pthread_cond_signal(&u_santa);
}
pthread_mutex_unlock(&m);
}
如果有帮助,这里还有d_sob
void d_sob(){ //dobar
int id;
pthread_mutex_lock(&m);
id=br_sob+2;
br_sob++;
printf ("Nastao je sob %d\n",br_sob);
while(br_sob<10){
pthread_cond_wait(&u_sob,&m);
}
pthread_cond_signal(&u_santa);
printf ("Sob ceka slobodu %d, a za analizu br_sob=%d\n",id,br_sob);
pthread_mutex_unlock(&m);
}
任务:d_santa 仅创建一次,并且在 d_patuljak 不断创建时始终保持 sleep 或做一些“有用”的事情,当创建第 3 组时,他们会唤醒圣诞老人,以便他可以帮助他们解决所有问题(请注意,如果 d_patuljak 快速创建,则可以超过 3 个 patuljaks 但圣诞老人只需要 3 个一组!!)。类似于 sob 它们一直被创建直到它们达到 10 之后它们可以被广播(不能有 11 个)
我的解决方案(想法):我将创建 1、2、3 个 patuljaks,每个 patuljaks 在数组中都有自己的位置。创建 patuljak 3 时,他将唤醒圣诞老人(也绕过 pthread_cond_wait)!圣诞老人将醒来并调用 3 个连续的 pthread_cond_signals 来释放 patuljak 1、patuljak 2 然后 patuljak 3 => 注意:patuljak 1 被释放以结束他的线程然后被我放在 pthread_cond_signal 正下方的 pthread_join“销毁”!!
问题:pthread_join(patuljak 1) 一直在等待 patuljak 1,这意味着 pthread_cond_signal 没有设法释放 patuljak 1(可能是 patuljak 2 或 3)?我不知道解决这个问题的方法有没有办法知道将发布什么或者如何准确发布 patuljak 1、2、3?我会使用广播,但我不能 patuljak 4 将被释放,圣诞老人应该只带 3 人一组。编辑:我将 pthread_cond_signal 与 pthread_cond_broadcast 切换为 patuljaks 问题并没有消失。
无论如何,这个程序比这还要大我有一个与 raindeers(=sob) 类似的问题,我可以并尝试广播但他们也卡在 pthread_join,我有一种感觉,如果 patuljaks 的问题同样得到解决将跟随 raindeers (patuljak=>dwarf) xd。
最佳答案
两条规则将解决这类问题:
仅当可能正在等待条件变量的任何线程可以执行任何需要完成的任务时,才调用pthread_cond_signal
。否则,总是调用pthread_cond_broadcast
。如有疑问,请调用 pthread_cond_broadcast
,因为它始终是安全的。
始终在一个循环内调用 pthread_cond_wait
,该循环会在发生虚假唤醒时再次调用 pthread_cond_wait
。您必须设计您的代码,以便“额外”唤醒是无害的,并且如果线程在“不应该”唤醒时会返回休眠状态。
关于c - 如何知道哪个线程被 pthread_cond_signal 释放了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20458208/
我有一个附加了 View Controller 的 AVAudioPlayer 实例。 @property (nonatomic, retain) AVAudioPlayer *previewAudi
我是java初学者。假设我声明了一个 Account 类型的变量 Account _account = new Account("Thomas"); 然后在其他地方我做了这样的事情: _account
我在我的应用程序中使用了 3 个 UIViewController,现在我想知道当我从另一个应用程序切换到另一个 UIViewController 时释放它们是否是一个好主意。显然,这将是隐藏的,当它
我分配了一个直接缓冲区: ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024); 我读过: Deallocating Direct Buf
场景。我有一个图表,我可以使用右键单击来执行平移。这非常有效。然后我完美地添加了右键菜单。 问题。现在,即使在拖动操作完成后释放鼠标,也会显示右键菜单。 有没有办法在 Java Swing 或 Jav
我使用此代码获取 ABPerson 的姓氏 CFStringRef lastNameRef = ABRecordCopyValue((ABRecordRef)personRecordRef, kABP
目前,我们在基于 C 的嵌入式应用程序中使用 malloc/free Linux 命令进行内存分配/取消分配。我听说这会导致内存碎片,因为内存分配/取消分配会导致堆大小增加/减少,从而导致性能下降。其
当我尝试释放缓冲区时遇到问题。每次我尝试将缓冲区传递给释放方法时,都会发生段错误。 Valgrind 确认段错误位于 BufferDeallocate 方法中。 ==30960== Memcheck,
我想知道何时按下或释放修改后的键(Ctrl 或 Shift)。 基本上,用户可以在按下修改键的情况下执行多次击键,而我不想在它被释放之前执行一个操作(想想 Emacs 和 Ctrl + X + S).
我编写了一个相当大的网络应用程序。它运行良好一段时间,然后慢慢开始运行缓慢,因为 DOM 节点开始爬升到 80,000 - 100,000 左右。 所以我一直在 Chrome 开发工具控制台 (DCT
我知道在像 c 这样的语言中,我需要在分配内存后释放它。 (我来自 Java),对此我有几个问题: 当我在做的时候: int array[30]; (即创建一个大小为 30 个整数的数组)与
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to release pointer from boost::shared_ptr? Detach
我有一个可以从多个后台线程访问的类,可能同时访问。我无法复制该类,因为重新创建它的内容(处理或内存方面)可能很昂贵。 也有可能在后台处理仍在继续并访问该属性时替换了此类的属性。 目前我有定期的保留/释
这个问题是对: 的扩展链接-1:Creating an image out of the ios surface and saving it Link-2:Taking Screenshots fro
我有一个实例变量 NSMutableArray* searchResults。 首先,我初始化它: self.searchResults = [[NSMutableArray alloc] init]
如果我在堆上声明一些东西,比如 char *a=new char[1000] 并且主程序停止,如果没有 delete[]<,那么分配的内存会发生什么 调用?它保留在堆上还是自动释放? 最佳答案 就C+
在开发相机应用时,我遇到了一个异常,该异常仅在我切换到其他应用时发生(onPause() 用于我的应用)。 01-15 17:22:15.017: E/AndroidRuntime(14336): F
使用 JDK 1.8 编译时出现 maven 编译器错误 无法执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (de
将 BufferedImage 保存到磁盘(以释放内存)的最快方法是什么? 我的 Java 应用程序处理大量图像(每约 300 毫秒将图像加载到内存中)。大多数这些图像都会立即被丢弃 (gc),但每隔
使用 JDK 1.8 编译时出现 maven 编译器错误 未能在项目 DUMMY 上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.8.1:
我是一名优秀的程序员,十分优秀!