C#多线程间的同步问题

使用线程时最头痛的就是共享资源的同步问题,处理不好会得到错误的结果,C#处理共享资源有以下几种:

1、lock锁

2、Mutex类

3、semaphore

其中lock 和mutex 差不多,都是锁定同一个资源,不同之处mutex在整个进程中都可以访问到。

semaphore是锁定多个资源,比如同一时期只能有两个线程访问,其它线程只能等待其中之一释放锁才能使用,Semaphore就是一个可以多次进入的“Mutex”。Mutex永远只允许一个线程拥有它,而Semaphore可以允许多个线程请求,因此Semaphore被用于管理一次可以允许多个线程进入并发访问资源的情况。

比如:

 class Program
    {
        static Semaphore sp = new Semaphore(2,2);
        static void Main(string[] args)
        {

            DoWork();
            Console.Read();
        }

        private static void DoWork()
        {
            for (int i = 0; i < 10; i++)
            {
                Task.Run(() => {
                    sp.WaitOne();
                    Console.WriteLine("线程:"+Thread.CurrentThread.ManagedThreadId+",开始运行");
                    Thread.Sleep(new Random().Next(1000));
                    Console.WriteLine("线程:" + Thread.CurrentThread.ManagedThreadId + ",结束此运行");
                    sp.Release();
                });
            }
        }
    }
时间: 2024-08-12 02:37:11

C#多线程间的同步问题的相关文章

第七十四课、多线程间的同步

一.多线程间的同步 1.多线程编程的本质 (1).并发性是多线程编程的本质 (2).在宏观上,所有线程并行执行 (3).多个线程间相互独立,互不干涉 2.特殊情况下,多线程存在依赖 煮菜和煮饭这两个线程结束后,才能进行吃饭的线程 3.同步的概念 (1).在特殊情况下,控制多线程间的相对执行顺序 (2).QThread类支持线程间的同步 #include <QCoreApplication> #include <QThread> #include <QDebug> /*

二进制信号量在多线程间实现同步模型

在多线程同步开发中,为了实现执行线程在条件未到达时等待条件到达,进而用忙等待实现等待,这样大大浪费了CPU资源且CPU占用很大,导致服务器系统整体性能下降.为了解决CPU占用大的问题,用信号量替代忙等待条件,实现执行线程在条件未到达时用阻塞等待条件到达.下面是用二进制信号量实现多线程间同步简单设计模型.#include<stdio.h>#include<unistd.h>#include<string.h>#include<semaphore.h> #def

有名信号量在多线程间的同步

/*semopen_pth.c*/#include <stdio.h>#include <semaphore.h>#include <fcntl.h>#include <pthread.h>#include<stdlib.h>void print();void * thread_function(void *arg);sem_t * sem; int main(int argc,char * argv[]) { int n=0,i=0; pthr

无名信号量在多线程间的同步

//无名信号量的常见用法是将要保护的变量放在sem_wait和sem_post中间所形成的临界区内,这样该变量就会被//保护起来,例如:#include <pthread.h>#include <semaphore.h>#include <sys/types.h>#include <stdio.h>#include <unistd.h>int number; // 被保护的全局变量sem_t sem_id;void* thread_one_fun

vc++高级班之多线程篇[6]---线程间的同步机制①

①.线程同步的必要性: int g_Num = 0; UINT __cdecl ThreadProc(LPVOID lpParameter) { for (int idx = 0; idx < 100; ++idx) { g_Num = g_Num+1; CString strNum; strNum.Format(_T("%d"), g_Num); g_Num = g_Num-1; } return 0; } void CThreadTestDlg::OnBnClickedBtn

C# 多线程之线程同步

多线程间应尽量避免同步问题,最好不要线程间共享数据.如果必须要共享数据,就需要使用同步技术,确保一次只有一个线程访问和改变共享状态. 一::lock语句 lock语句事设置锁定和接触锁定的一种简单方法.其语法非常简单: lock (obj) { // 需要发生同步的代码区 } 将共享数据的操作代码,放在上述的"{...}"区域内.锁定的对象(obj)必须是引用类型,如果锁定一个值类型,实际是锁定了它的一个副本,并没有实现锁定功能. 一般地,被锁定对象需要被创建为 私有 只读 引用类型:

vc++高级班之多线程篇[7]---线程间的同步机制②

//示例代码: CStringArray g_ArrString; UINT __cdecl ThreadProc(LPVOID lpParameter) { int startIdx = (int)lpParameter; for (int idx = startIdx; idx < startIdx+100; ++idx) { CString str; str.Format(_T("%d"), idx); g_ArrString.Add(str); } return 0; }

【2017-06-20】Linux应用开发工程师C/C++面试问题之一:Linux多线程程序的同步问题

参考之一:Linux 线程同步的三种方法 链接地址:http://www.cnblogs.com/eleclsc/p/5838790.html 简要回答: Linux下线程同步最常用的三种方法就是互斥锁.条件变量及信号量. 互斥锁通过锁机制来实现线程间的同步,锁机制是同一时刻只允许一个线程执行一个关键部分的代码. 条件变量是用来等待而不是用来上锁的,条用来自动阻塞一个线程,直到某特殊情况发生为止,通常条件变量和互斥锁同时使用. 线程的信号量与进程间通信中使用的信号量的概念是一样,它是一种特殊的变

系统API函数实现多线程及线程同步

1.线程的创建 须包含头文件:#include <windows.h> HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); lpThreadAttributes:指向SECURI