2008-09-21 51 views

回答

1

我对线程做的最有趣的事情之一是编写一个多线程应用程序来解决迷宫。

虽然没什么突破,但它确实很有趣。

27

我让它们按我想要的一样工作!太酷了!

0

Ian P,精心阐述? AFAIK你不需要使用线程来解决迷宫,除非当然迷宫太复杂了,等待时间变得如此难以忍受,你必须添加状态栏,以便用户不会觉得无聊,并认为你的程序挂起。

6

我很想说,我已经巧妙地使用无锁数据结构并行化算法,以便在n核处理器上获得n倍的性能提升。但我从来没有实际需要,特别是因为我的大部分专业代码都是针对单核系统的。

几乎每次我用多个线程,在任何语言,它已经有两个原因:

  • 系统(或第三方)提供了一个阻塞API,我需要一个异步的(或者至少让几个ops一次运行)。
  • 利用先进的基于优先级的时间安排来保持一切的美好和响应,而无需手工将所有慢速操作切成小块。

必要的,但不是你称之为迷人的。

0

哦 - 它们不是复杂的迷宫。

迷宫是在一个阵列中,类似这样的定义:

String[] MazeArray = new String[5]; 

MazeArray[0] = "---X---X-------XF"; 
MazeArray[0] = "-X-X-X---XXXXXXX-"; 
MazeArray[0] = "-X-X-X-X-X---X---"; 
MazeArray[0] = "-X-X-X-XXX-X-X-X-"; 
MazeArray[0] = "SX---X-----X---X-"; 

我会生成一个新的工作线程时,有路径叉,并有螺纹调查这条道路。然后,通过一些基本逻辑,我可以确定最短路径,最长路径等。

上面的例子显然过于简化了,但它应该说明这一点。这是一个有趣的练习,如果你有几分钟的时间,你应该尝试一下。

伊恩

+0

那么MazeArray的其他四行如何看起来像? :)(即检查你的指数) – 2008-09-21 14:54:48

+0

哈哈 - 对不起,复制/粘贴赢得了那一个。 – 2008-09-21 17:37:30

+0

胡姆,相当有趣。解决一个典型的线程递归问题。非常惊人! – 2008-10-02 13:00:32

13

我不知道这是否计数,但对我工作多线程软件本身引人入胜,与其说是目的,他们实现的。你有10,20,100名工作人员在你的程序中使用相同的基础设施(单身人士,文件等)。让所有事情与互斥体,信号量,上下文切换等协调一致,都是非常棒的观察,比如做一名经理和你的团队正在一起工作。您阅读应用程序日志,查看线程为实现共同目标而合作,这非常棒。任何人都可以涉及这种感觉?

0

嗯,这是真正的香草,但它是一个很好的垫脚石走向更具创造性的线程:

在上载新的数据和过程它换我的类型的请求,该请求线程接受数据并将其放入队列中,然后用户快乐地前进。一个或多个后台线程不断出列项目并以某种方式处理它们。

6

我对线程毫无用处,我得让我的女朋友重新缝制我的按钮。

0

我用C++编写了一个小型fcgi servlet模型,它为每个新请求立即分配一个新线程。

如果你不认为这很酷,你应该看看当我通过它抽取3K req/s时发生了什么。我不小心忘了清理它们,即使你们自己终止了,并且实际上停止使用内存,他们仍然使用寻址,并且我已经快速地将应用程序重新分配了比我更多的内存并停止创建线程。

(我是在32位的时间和创建2^32个线程后,它确实停止了。有谁知道它会与64位做)

而且,我创建了一个多线程(当然,分叉)广度 - 着名的命令rm -rf的第一个叉上目录替换。主要是我感到沮丧的是rm -rf似乎等待IO以yay/nay响应来响应,这使得它在某些目录结构(例如squid缓存)上变得缓慢。这段代码的唯一真正需要注意的是它只有娱乐价值,如果在整个文件系统使用过,这将是2个场景之间的竞争:

  1. 磁盘被消灭使其无法使用,并且可能擦除命令这可以让你告诉它死亡。
  2. 由于大量的分岔导致系统“叉撞击”,并使其操作密集程度非常高,因此不再对命令作出响应响应

而且在“叉轰炸”的情况下,大量产卵率可能会导致递归RM停止本身(或打ULIMIT如果有的话)

3

我们曾经写过一个多线程的应用程序,它本质上读取文件逐行并在内部数据库中进行查找以查看是否存在匹配,追加一些数据并移至下一行。虽然复杂性是可以同时处理多个文件,并且可以搜索每个文件的多个记录。有一个管理员类知道有多少线程可用,并负责将可用工作线程分配给每个文件(如果只有一个文件需要处理,它将接收所有40个线程,如果有5个文件,则取决于优先级,每个人都可以获得40分之一)。我们最初使用了Async委托,但注意到很难捕获异步线程中可能发生的任何异常,所以我们使用.net中的传统线程启动。

关键在于在管理员类中收集了ManualResetEvents,该类由ManualResentEvents组成,这些ManualResentEvents是工作程序类(线程)中的公共属性。当一个工作线程完成时,它会表示它是ManualResetEvent,它将被Manager类中的.WaitAny()接收。然后经理会知道其中一个线程已经完成并将开始一个新线程。实际上它比这更复杂一些,但这是它所做的核心。

困难的部分是单元测试,以确保在任何给定的时间正确的线程数正在运行。我们进行了测试,就好像队列中只有一个文件(获得所有40个线程),然后引入了另一个文件,并且线程的分配必须循环到这两个文件的一个片段。我们有一个“模拟对象”,它基本上有一个线程睡眠参数,我们将传递一个值(以毫秒为单位)来控制每个线程处理多长时间,以便我们可以很好地确定何时执行断言或询问文件处理器来查看它当前正在处理的线程数量,记录数量。还有一些测试会有两个文件以每个20个线程运行,然后一个文件将完成,并且所有记录线程将在第一个文件上完成,它们将被重新分配给第二个文件以帮助它更快完成。

我确定这不是我们实际做的最清楚的解释,我真的需要写一篇关于它的博客文章。如果有人需要更多的信息,请联系我,我会尽力回答。

0

具有异步输入/输出的简单客户端服务器。

3

我最近被雇用来帮助处理在Microsoft Windows系统上运行的相当大且复杂的多线程应用程序,以及读写器锁定对象。这使得难以搜索死锁,所以我编写了一个死锁检测对象,该对象在其自己的线程中执行,每当它们试图锁定,成功或失败锁定和解锁时,都会从锁定对象发送信息消息(使用PostThreadMessage)。

通过在真值表中查找不同的线程和共享锁以及它们的状态,可以毫无疑问地查明死锁的原因和位置。

1

我创建了一个windows服务来咨询一堆RSS提要,并将检索到的信息存储在数据库中。由于应用程序可以包含很多RSS提要,因此一个线程池每隔n次查询一次RSS数据包。

Thorsten79一样,最激动人心的部分是看你的线程合作,并作为一个团队一起工作。

2

我发现我可以在不使用任何同步工具的情况下创建一个FIFO,只有一个写者和一个读者。

(所以主从具有2 * n个FIFO ..没有任何互斥/ semaphone !!)

如果你有很长的链表,你并不需要在一端插入和同步在另一端去除。

的诀窍是在列表中(总是一个元素保持 - ; 代码是非常小的

我的自尊心受到了“凹陷”当硬件的家伙告诉我..that是显而易见的( - :

0

我猜实现多线程用于DOS是一个最酷的事情我做的线程..

0

我创建了无锁间通信一个线程库来简化多线程编程德尔福只是:。OmniThreadLibrary

(为了给出应有的功劳 - 我没有写出无锁结构,GJ做到了。)

1

用于网络爬虫的分布式链接检查系统。由于网络爬虫是一个非常容易线程化的解决方案,我不知道这是否是重要的...

我写了一个算法来破解DES,当我在大学时在大学定制256 CPU机器上运行。这非常简洁,但实际上只是一个分而治之的问题。

0

我用Java编写了一个使用线程池的图像过滤框架。

我很惊讶即使在单处理器的单核机器上,多个并行线程也能运行多少这些过滤器。当我找到一些空闲时间时,我想实际弄明白这是为什么;我所做的只是访问内存和数学计算。

线程岩(只要他们不锁定)。

荣誉给Java线程池,太。

0

我为HDOS编写了一个多线程库。 HDOS是一个在HeathKit系统上运行的8位操作系统。我拦截了系统时钟滴答(如果我没有记错的话,每隔55毫秒),并且有一个调度程序来决定以循环方式运行下一个线程。当然,由于操作系统本身不是多线程的,因此在任何给定的时间只有一个线程被允许在操作系统中。

我从来没有做过任何有用的事情。这只是一个有趣的项目,我决定去看看我能否做到。

0

我做了一个快速排序的实现,其中分区的左侧和右侧同时排序。它几乎是仅使用1个线程的相同代码的两倍。

0

我写了一个无锁高速缓存,比最常见的基于锁的高速缓存库快10倍。弄清楚如何执行复杂的CASing逻辑,并提出一种LRU的替代方案,这种替代方案没有遭受锁定开销,这真的很有趣。

我还写了一个分布式的主人工作框架,后来我对抽象进行了原型化,以支持fork-join和map-reduce。我需要在某些时候重做这些,因为它们不是生产质量,但这是相当有趣的分流。

我真的很喜欢写一个SkipList数据结构,只是为了学习如何。已经有一个核心实现,但它很酷,很简单,我很想深入其中。这将纯粹扔掉代码,但教育。

0

这不是多线程的应用程序,而是一个展示包括lambda表达式和对象初始值设定项的C#3.0功能的小代码片段。不是你想到的,我确定—,但是“我已经用线程完成了这个”冷静的事情“。

new Thread(() => 
{ 
    // do stuff in a new thread's context 
}) 
{ 
    Name = "Thread " + GetHashCode().ToString(), 
    Priority = this.threadPriority 
} 
.Start(); 
0

我写了一个C#多线程执行者/消息传递的实现,自从我写多线程已经非常简单了!编写它本身是非常有趣的,用于消息队列的无锁数据结构。每个演员都没有一个线程,而是一组线程循环通过演员并运行每个演员。 由于多线程是如此简单,我有这个系统玩,我写了几件很酷的事情:
一个简单的套接字服务器/客户端演示应用
一个多线程的网络爬虫(我将回到那一个)
一个过程内容生成游戏
和其他一些东西,但他们都小,无聊

0

的(第三方应用程序),它不支持从不同的应用程序或线程同时呼叫多线程调用?虽然可以执行多个实例(并且这是我最终实现它的方式),但某些应用程序操作不能同时在不同的应用程序实例上执行。

0

看到这个parallel N-puzzle solver。它通过迭代加深搜索谷物来实现搜索来解决Npuzzle问题。这是在我设计的并行编程语言中完成的,它使得易于来分岔;几乎整个程序中的魔法都隐藏在“fork parallel”运算符中(|| ...)您必须在代码中查找它。

相关问题