同步线程和进程间的通信

最近回去学习了一下进程和进程间的通信,有时候很多东西久不看了也就一下子忘了==

这里面有好几个互斥对象使用线程的

  1 void mListText(CString str)
  2 {
  3     m_list_text.AddString(str);
  4     m_list_text.SendMessage(WM_VSCROLL, SB_PAGEDOWN, 0);
  5 }
  6
  7
  8
  9 DWORD WINAPI Thread1(LPVOID lpParameter)
 10 {
 11     //GetDlgItem(IDC_STATIC_THREAD)
 12     //SetDlgItemText(NULL, IDC_STATIC_THREAD, L"Thread1 is running");
 13     //CString str1 = L"Thread1 is running";
 14     //C线程Dlg test;
 15     //test.m_list_text.AddString(str1);
 16     //SetDlgItemText(test, IDC_STATIC_THREAD, L"Thread1 is running");
 17     //AfxMessageBox(L"Thread1 is running");
 18     CString str2 = L"Thread1 is running";
 19     m_list_text.AddString(str2);
 20     //Sleep(1000);
 21     //mListText(str2);
 22     return 0;
 23 }
 24
 25 DWORD WINAPI Thread2(LPVOID lpParameter)
 26 {
 27     //GetDlgItem(IDC_STATIC_THREAD)
 28     CString str2 = L"Thread2 is running";
 29     m_list_text.AddString(str2);
 30     //Sleep(1000);
 31     //mListText(str2);
 32     //test.m_list_text.AddString(str2);
 33     //SetDlgItemText( IDC_STATIC_THREAD, L"Thread2 is running");
 34     //AfxMessageBox(L"Thread2 is running");
 35     return 0;
 36 }
 37
 38
 39 //线程,不同步的
 40 void C线程Dlg::OnStatThread()
 41 {
 42     // TODO:  在此添加控件通知处理程序代码
 43     //SetDlgItemText( IDC_STATIC_THREAD,L"Thread2 is running");
 44     HANDLE T1, T2;
 45     int i = 0;
 46     while (i != 5)
 47     {
 48         T1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);
 49         T2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);
 50         Sleep(1000);
 51         i++;
 52     }
 53     CloseHandle(T1);
 54     CloseHandle(T2);
 55 }
 56
 57 //线程3,线程4 使用InitializeCriticalSection()来操作临界对象
 58 DWORD WINAPI Thread3(LPVOID lpParameter)
 59 {
 60     C线程Dlg test;
 61     while (true)
 62     {
 63         EnterCriticalSection(&Section);   //进入临界区
 64         a1++;
 65         if (a1 <= 10)
 66         {
 67             Sleep(1000);
 68             CString str;
 69             str.Format(L"Thread3 is running,count=%d", a1);
 70             //AfxMessageBox(str);
 71             mListText(str);
 72             LeaveCriticalSection(&Section);   //离开临界区
 73         }
 74         else
 75         {
 76             LeaveCriticalSection(&Section);
 77             break;
 78         }
 79     }
 80     return 0;
 81 }
 82
 83 //线程4
 84 DWORD WINAPI Thread4(LPVOID lpParameter)
 85 {
 86     C线程Dlg dlg;
 87     while (true)
 88     {
 89         EnterCriticalSection(&Section);   //进入临界区
 90         a1++;
 91         if (a1 <=10)
 92         {
 93             Sleep(1000);
 94             CString str;
 95             str.Format(L"Thread4 is running,count=%d", a1);
 96             mListText(str);
 97             //AfxMessageBox(str);
 98             //AfxMessageBox(L"Thread4 is running");
 99             LeaveCriticalSection(&Section);   //离开临界区
100         }
101         else
102         {
103             LeaveCriticalSection(&Section);
104             break;
105         }
106     }
107     return 0;
108 }
109
110 //同步线程
111 void C线程Dlg::OnSynchronous()
112 {
113     // TODO:  在此添加控件通知处理程序代码
114     HANDLE T3, T4;
115     T3 = CreateThread(NULL, 0, Thread3, NULL, 0, NULL);
116     T4 = CreateThread(NULL, 0, Thread4, NULL, 0, NULL);
117
118     CloseHandle(T3);
119     CloseHandle(T4);
120
121     //初始化临界区
122     InitializeCriticalSection(&Section);
123     if (a1 == 10)
124     {
125         DeleteCriticalSection(&Section); //删除临界区
126     }
127 }
128
129 //线程5,线程6使用CCriticalSection操作临界区
130 DWORD WINAPI Thread5(LPVOID lpvoid)
131 {
132     m_Section.Lock();   //对临界区锁定
133     a1++;
134     CString str;
135     str.Format(L"Thread5 is running,count=%d", a1);
136     mListText(str);
137     //AfxMessageBox(str);
138     m_Section.Unlock();  //解锁,释放临界区
139     return 0;
140 }
141
142 DWORD WINAPI Thread6(LPVOID lpvoid)
143 {
144     m_Section.Lock();   //对临界区锁定
145     a1++;
146     CString str;
147     str.Format(L"Thread6 is running,count=%d", a1);
148     //AfxMessageBox(str);
149     mListText(str);
150     m_Section.Unlock();  //解锁,释放临界区
151
152     return 0;
153 }
154
155
156
157 void C线程Dlg::OnCCriticalSectionThread()
158 {
159     // TODO:  在此添加控件通知处理程序代码
160     HANDLE T5, T6;
161     T5 = CreateThread(NULL, 0, Thread5, NULL, 0, NULL);
162     T6 = CreateThread(NULL, 0, Thread6, NULL, 0, NULL);
163     CloseHandle(T5);
164     CloseHandle(T6);
165     Sleep(3000);
166 }
167
168
169 void C线程Dlg::ListText(CString str)
170 {
171     m_list_text.AddString(str);
172     m_list_text.SendMessage(WM_VSCROLL, SB_PAGEDOWN, 0);
173 }
174
175
176
177 void C线程Dlg::OnMListClear()
178 {
179     // TODO:  在此添加控件通知处理程序代码
180
181         m_list_text.DeleteString(0);
182
183
184
185     //m_list_text.DeleteTempMap();
186 }

由于之前测试的时候m_list_text.AddString()不是一个个显示的,所以在控制台下测试了一下,如下

  1 #include<windows.h>
  2 #include<iostream>
  3 HANDLE hevent;   //设置事件对象
  4 HANDLE hmutex;   //第二种方法,设置互斥事件对象
  5 //CEvent event; 也可以用CEvent事件来操作,步骤和HANDLE差不多
  6
  7 int a=0;
  8
  9 //用事件操作临界区步骤:
 10 //创建事件对象-->初始化时设置为无信号-->设置为有信号
 11 //在线程中:等待事件-->设置为无信号事件-->进行操作-->设置为有信号事件
 12 DWORD WINAPI Thread7(LPVOID lpParemt)
 13 {
 14     while (true)
 15     {
 16
 17         WaitForSingleObject(hevent, INFINITE);  //无限等待请求事件
 18         ResetEvent(hevent);  //设置为无信号事件
 19         Sleep(100);
 20         if (a < 20)
 21         {
 22             a++;
 23             std::cout << "Thread7 is running and count= " << a << std::endl;
 24             SetEvent(hevent);
 25         }
 26         else
 27         {
 28             SetEvent(hevent);
 29             break;
 30         }
 31     }
 32     return 0;
 33 }
 34 DWORD WINAPI Thread8(LPVOID lpParemt)
 35 {
 36     while (true)
 37     {
 38
 39         WaitForSingleObject(hevent, INFINITE);  //无限等待请求事件
 40         ResetEvent(hevent);  //设置为无信号事件
 41         Sleep(100);
 42         if (a < 20)
 43         {
 44             a++;
 45             std::cout << "Thread8 is running and count= " << a << std::endl;
 46             SetEvent(hevent);
 47         }
 48         else
 49         {
 50             SetEvent(hevent);
 51             break;
 52         }
 53     }
 54     return 0;
 55 }
 56
 57 //线程9,10 使用互斥事件使线程同步
 58 DWORD WINAPI Thread9(LPVOID lpParemt)
 59 {
 60     while (true)
 61     {
 62         WaitForSingleObject(hmutex, INFINITE);   //请求互斥对象
 63         if (a < 20)
 64         {
 65             a++;
 66             Sleep(100);
 67             std::cout << "mutex thread9 is running and the count=" << a << std::endl;
 68             ReleaseMutex(hmutex);
 69         }
 70         else
 71         {
 72             break;
 73         }
 74     }
 75     return 0;
 76 }
 77
 78 DWORD WINAPI Thread10(LPVOID lpParemt)
 79 {
 80     while (true)
 81     {
 82         WaitForSingleObject(hmutex, INFINITE);   //请求互斥对象
 83         if (a < 20)
 84         {
 85             a++;
 86             Sleep(100);
 87             std::cout << "mutex thread10 is running and the count=" << a << std::endl;
 88             ReleaseMutex(hmutex);
 89         }
 90         else
 91         {
 92             break;
 93         }
 94     }
 95     return 0;
 96 }
 97
 98
 99 int main()
100 {
101     HANDLE H1, H2;
102     hevent = CreateEvent(NULL, false, false, NULL);    //无信号的自动重置事件,第二个参数设置事件自动还是手动,第三是有无信号参数
103     SetEvent(hevent);    //设置为有信号事件
104     H1 = CreateThread(NULL, 0, Thread7, NULL, 0, NULL);
105     H2 = CreateThread(NULL, 0, Thread8, NULL, 0, NULL);
106     CloseHandle(H1);
107     CloseHandle(H2);
108     Sleep(3000);
109
110     //使用互斥事件
111     a = 0;
112     HANDLE H3, H4;
113     hmutex = CreateMutex(NULL, FALSE, NULL);   //设置对象为未能取得事件所有权
114     H3 = CreateThread(NULL, 0, Thread9, NULL, 0, NULL);
115     H4 = CreateThread(NULL, 0, Thread10, NULL, 0, NULL);
116     CloseHandle(H3);
117     CloseHandle(H4);
118     Sleep(3000);
119
120     //进程间的通信
121
122
123     return 0;
124 }

运行结果如下:

进程间的通信(邮慒通信)

服务端

 1 #include<iostream>
 2 #include<windows.h>
 3 int main()
 4 {
 5     HANDLE mail;
 6     mail = CreateMailslot(L"\\\\.\\mailslot\\mysolt", 0, MAILSLOT_WAIT_FOREVER, NULL);
 7     if (mail == INVALID_HANDLE_VALUE)
 8     {
 9         std::cout << "创建邮慒失败" << std::endl;
10         CloseHandle(mail);
11     }
12     else
13     {
14         std::cout << "创建邮慒成功" << std::endl;
15         char text[100];
16         std::string str;
17         DWORD readtext;
18         while (true)
19         {
20
21             if (ReadFile(mail, text, 100, &readtext, 0))
22             {
23                 std::cout << text << std::endl;
24             }
25             else
26             {
27                 std::cout << "读取数据失败" << std::endl;
28             }
29         }
30     }
31     CloseHandle(mail);
32     Sleep(2000);
33     return 0;
34 }

客户端

 1 #include<iostream>
 2 #include<windows.h>
 3 int main()
 4 {
 5     HANDLE mail;
 6     char text[] = "just a test";
 7     DWORD wirtetext;
 8     mail = CreateFile(L"\\\\.\\mailslot\\mysolt", GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
 9     if (mail == INVALID_HANDLE_VALUE)
10     {
11         std::cout << "邮慒打开失败" << std::endl;
12     }
13     else
14     {
15         while (true)
16         {
17             std::cout << "write data" << std::endl;
18             std::cin >> text;
19             //std::cin.getline(text);
20             if (WriteFile(mail, text, sizeof(text), &wirtetext, NULL))
21             {
22                 std::cout << "邮慒写入数据成功" << std::endl;
23             }
24             else
25             {
26                 std::cout << "邮慒写入数据失败" << std::endl;
27             }
28         }
29     }
30     Sleep(1000);
31     return 0;
32 }
时间: 2024-10-08 16:09:29

同步线程和进程间的通信的相关文章

Linux 线程与进程,以及通信

http://blog.chinaunix.net/uid-25324849-id-3110075.html 部分转自:http://blog.chinaunix.net/uid-20620288-id-3025213.html 1.首先要明确进程和线程的含义: 进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位.与程序相比,程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体.进程是程序在某个数据集上的执行,

linux 进程间的通信

现在linux使用的进程间通信方式:(1)管道(pipe)和有名管道(FIFO)(2)信号(signal)(3)消息队列(4)共享内存(5)信号量(6)套接字(socket) 为何进行进程间的通信:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到.C.通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程).D.资源共享

Linux进程间的通信

一.管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: A. 管道是半双工的,数据只能向一个方向流动: B. 需要双工通信时,需要建立起两个管道: C. 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): D. 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中. 匿名管道的创建:该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义;因此,一

从AIDL开始谈Android进程间Binder通信机制

本文首先概述了Android的进程间通信的Binder机制,然后结合一个AIDL的例子,对Binder机制进行了解析. 概述 我们知道,在Android app中的众多activity,service等组件可以运行在同一进程中,也可以运行在不同进程中.当组件运行在同一进程中进行通信就显得比较简单,在之前的Android线程间通信机制中已经讲过了:而当它们运行在不同的进程中时,就需要使用我们本文中所要介绍的Binder机制了. Binder作为一种进程间通信机制,负责提供远程调用的功能(RPC),

Android进程间的通信之AIDL

Android服务被设计用来执行很多操作,比如说,可以执行运行时间长的耗时操作,比较耗时的网络操作,甚至是在一个单独进程中的永不会结束的操作.实现这些操作之一是通过Android接口定义语言(AIDL)来完成的.AIDL被设计用来执行进程间通信,另一种实现方式见博文Android进程间的通信之Messenger.本文我们将学习如何创建AIDL文件实现Android进程间通信.在正式学习之前,我们先澄清一些"事实". 关于Android Service 1.Android服务不是后台任务

Nginx学习——Nginx进程间的通信

nginx进程间的通信 进程间消息传递 共享内存 共享内存还是Linux下提供的最主要的进程间通信方式,它通过mmap和shmget系统调用在内存中创建了一块连续的线性地址空间,而通过munmap或者shmdt系统调用可以释放这块内存.使用共享内存的优点是当多个进程使用同一块共享内存时,在不论什么一个进程改动了共享内存中的内容后,其它进程通过訪问这段共享内存都可以得到改动后的内容. Nginx定义了ngx_shm_t结构体.用于描写叙述一块共享内存, typedef struct{ //指向共享

Android进程间的通信之Messenger

Android进程间的通信方式可以通过以下两种方式完成: 1 Android接口定义语言(AIDL) 2 使用Messenger绑定服务 本文我们将学习使用Messenger绑定服务的方式进行进程间的通信. Android AIDL和Messenger区别 使用Messenger是执行进程间通信最简单的方法,因为Messenger会在单一线程中创建包含所有请求的队列,这样您就不必对服务进行线程安全设计.而纯粹的AIDL接口会同时向服务发送多个请求,服务随后必须应对多线程处理.AIDL通常应用在服

Linux/UNIX之进程间的通信(2)

进程间的通信(2) 有三种IPC我们称为XSI IPC,即消息队列.信号量以及共享存储器,它们之间有很多相似之处. 标识符和键 每个内核的IPC结构(消息队列.信号量或共享存储段)都用一个非负整数的标识符加以引用.例如,为了对一个消息队列发送或取消息,只需要知道其队列标识符.与文件描述符不同,IPC标识符不是小的整数.当一个IPC结构被创建,以后被删除时,与这种结果相关的标识符连续加1,知道达到一个整型数的最大值,然后又回到0. 标识符是IPC对象的内部名.为使多个合作进程能够在同一IPC对象上

Linux进程间的通信方法简介

一.本地进程间的通信方式: 1.管道(pipe) 利用管道文件可以进行进程间数据的通信,通常是具有血缘关系的父子进程间的通信方式. 管道通信为半双工模式,父子进程可以通过调用内核中的read()和write()命令来向管道文件进行读写操作. 管道通信是基于硬盘内的文件,所以I/O速度较低. 2.消息队列 消息队列是一种类似链表的数据结构,存放于内存中,因此I/O速度较管道更快,通过ipcs -q命令可以查看当前系统中被创建的消息队列. 多个不同进程可以使用同一个消息队列进行通信,消息队列中的数据