0

我不熟悉多线程。Image 我有一种方法可以对字符串进行深入搜索,并返回 2 个整数列表作为输出参数。

public static void CalcModel(string s, out List<int> startPos, out List<int> len)
    {
        // Do some intensive search
    }

对长字符串的搜索非常耗时。所以我想把字符串分成几个片段,用多线程搜索,然后重新组合结果(相应地调整 startPos)。

如何在这种过程中集成多线程?谢谢

我忘了提到以下两件事:

  1. 我想设置一个字符串长度截止,并让代码决定它需要多少个片段。
  2. 我很难将每个片段(在原始字符串上)的 startPos 与线程相关联。我怎样才能做到这一点?
4

3 回答 3

0

通常,您不会过于拘泥于细节,而是向每个线程发送一个“返回对象”。一旦你启动了所有线程,你就阻塞它们并等待它们全部完成。

在每个线程运行时,线程修改其工作对象并在产生输出时终止。

大致就是这样(我不能确切地说你想如何拆分它,所以也许你可以修改它):

public class WorkItem {
    public string InputString;
    public List<int> startPos;
    public List<int> len;
}

public static void CalcLotsOfStrings(string s, out List<int> startPos, out List<int> len)
{
    WorkItem wi1 = new WorkItem();
    wi1.InputString = s;
    Thread t1 = new Thread(InternalCalcThread1);
    t1.Start(wi1);
    WorkItem wi2 = new WorkItem();
    wi2.InputString = s;
    Thread t2 = new Thread(InternalCalcThread2);
    t2.Start(wi2);

    // You can now wait for the threads to complete or start new threads
    // When you're done, wi1 and wi2 will be filled with the updated data
    // but make sure not to use them until the threads are done!
}


public static void InternalCalcThread1(object item)
{
    WorkItem w = item as WorkItem;
    w.startPos = new List<int>();
    w.len = new List<int>();

    // Do work here - populate the work item data
}


public static void InternalCalcThread2(object item)
{
    // Do work here
}
于 2012-07-24T22:32:57.070 回答
0

你可以试试这个,但我不确定这些方法的性能

Parallel.Invoke(
           () => CalcModel(s,startPos, len), 
           () => CalcModel(s,startPos, len)
               );
于 2012-07-24T22:34:01.267 回答
0

创建和运行多个线程是一项非常简单的任务。您所需要的只是作为线程起点的方法。

假设您拥有CalcModel原始帖子中定义的方法,那么您只需要做:

// instantiate the thread with a method as starting point
Thread t = new Thread(new ThreadStart(CalcModel));

// run the thread
t.Start();

但是,如果您希望线程返回一些值,您可能会应用一个小技巧,因为您不能像使用return语句或out参数那样直接返回值。

您可以将线程“包装”在自己的类中,并让他将其数据存储在类的字段中:

public class ThreadClass {

    public string FieldA;
    public string FieldB;
    //...

    public static void Run () {

        Thread t = new Thread(new ThreadStart(_run));
        t.Start();
    }

    private void _run() {

        //...
        fieldA = "someData";
        fieldB = "otherData"
        //...
    }
}

这只是一个非常粗略的例子来说明这个想法。我不包括任何用于线程同步或线程控制的部分。

我想说更困难的任务是考虑CalcModel以一种可以并行化的方式拆分您的方法,然后可能更重要的是如何将部分结果连接在一起以形成一个单一的最终解决方案。

于 2012-07-24T22:36:19.293 回答