相关疑难解决方法(0)

在MultiThreaded方案中正确锁定List <T>?

好吧,我无法正确理解多线程场景.很抱歉再次提出类似的问题,我只是在互联网上看到许多不同的"事实".

public static class MyClass {
    private static List<string> _myList = new List<string>;
    private static bool _record;

    public static void StartRecording()
    {
        _myList.Clear();
        _record = true;
    }

    public static IEnumerable<string> StopRecording()
    {
        _record = false;
        // Return a Read-Only copy of the list data
        var result = new List<string>(_myList).AsReadOnly();
        _myList.Clear();
        return result;
    }

    public static void DoSomething()
    {
        if(_record) _myList.Add("Test");
        // More, but unrelated actions
    }
}
Run Code Online (Sandbox Code Playgroud)

想法是,如果激活录制,则对DoSomething()的调用将记录在内部List中,并在调用StopRecording()时返回.

我的规格是这样的:

  • StartRecording不被视为线程安全.用户应该在没有其他Thread调用DoSomething()时调用它.但如果它能以某种方式存在,那就太好了.
  • StopRecording也不是正式的线程安全的.如果可能的话,它会很棒,但这不是必需的.
  • DoSomething必须是线程安全的

通常的方式似乎是:

    public static void DoSomething()
    {
        object _lock …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading

24
推荐指数
3
解决办法
4万
查看次数

信号和解锁订单

void WorkHandler::addWork(Work* w){
    printf("WorkHandler::insertWork Thread, insertWork locking \n");
    lock();
    printf("WorkHandler::insertWork Locked, and inserting into queue \n");
    m_workQueue.push(w);
    signal();
    unLock();
}
Run Code Online (Sandbox Code Playgroud)

我按照教程,得到了这个.我想知道是否可以像这样更改singal()和unLock()的顺序

void WorkHandler::addWork(Work* w){
    printf("WorkHandler::insertWork Thread, insertWork locking \n");
    lock();
    printf("WorkHandler::insertWork Locked, and inserting into queue \n");
    m_workQueue.push(w);
    unLock();
    signal();
}
Run Code Online (Sandbox Code Playgroud)

如果我不能这样做,你能否详细说明为什么我不允许这样做?提前致谢.

c++ pthreads

15
推荐指数
1
解决办法
7802
查看次数

线程完成时通知,不锁定调用线程

我正在研究构建在.NET 3.5之上的遗留应用程序.这是一个我无法改变的约束.我需要执行第二个线程来运行长时间运行的任务而不锁定UI.线程完成后,我需要以某种方式执行回调.

现在我尝试了这个伪代码:

Thread _thread = new Thread(myLongRunningTask) { IsBackground = True };
_tread.Start();
// wait until it's done
_thread.Join();
// execute finalizer
Run Code Online (Sandbox Code Playgroud)

第二个选项不锁定UI,如下所示:

Thread _thread = new Thread(myLongRunningTask) { IsBackground = True };
_tread.Start();
// wait until it's done
while(_thread.IsAlive)
{
    Application.DoEvents();
    Thread.Sleep(100);
}
// execute finalizer
Run Code Online (Sandbox Code Playgroud)

当然第二种解决方案并不好,因为它会过度充电._thread完成后执行回调的正确方法是什么?另外,我如何知道线程是否被取消或中止?

*注意:*我无法使用BackgroundWorker,我无法使用Async库,我需要使用本机线程类.

c# multithreading

12
推荐指数
1
解决办法
3万
查看次数

标签 统计

c# ×2

multithreading ×2

.net ×1

c++ ×1

pthreads ×1