C语言生产者消费者进程代码问题

C语言生产者消费者进程代码问题,第1张

实现一个队列CQueue CQueue提供两个公有成员函数 addTail():往队列尾部增加一个元素 removeHead():读出并移除队列的第一个元素 生产者:两个线程通过调用CQueue::addTail()往队列中增加元素 消费者:一个线程通过调用CQueue::removeHead()从队列中读取元素 #include <iostream> #include <list> #include <windows.h> #include <process.h> using namespace std #define P(sem) WaitForSingleObject(sem,INFINITE) #define V(sem) ReleaseSemaphore(sem,1,NULL) class CQueue { public: void addTail()//往队列尾部增加一个元素 void removeHead()//读出并移除队列的第一个元素 private: list<int>L } CQueue buffer//全局的缓冲区 const int buf_size = 10//缓冲区大小 static int GOODS_ID = 0//商品序号 const int producers = 3//生产者数量 const int consumers = 8//消费者数量 void ProducerThread(void* param) void ConsumerThread(void* param) HANDLE empty,occupy,op_mutex int main() { int i int p_id[producers],c_id[consumers]

#include<iostream>

#include <Windows.h>

using namespace std

const int MAX_SEM_COUNT = 5//信号量数量

const int THREAD_COUNT = 10//线程数量

HANDLE g_sem//全局信号量对象句柄

DWORD WINAPI threadFunc(LPVOID)//线程函数前向声明

int main()

{

    HANDLE arrThread[THREAD_COUNT]

    g_sem = CreateSemaphore(NULL,MAX_SEM_COUNT,MAX_SEM_COUNT,NULL)

    if (!g_sem)

    {

        cout<<"call CreateSemaphore() failed!"<<endl

        return -1

    }

    DWORD threadID = -1

    for (int i = 0i <THREAD_COUNT++i)

    {

        arrThread[i] = CreateThread(NULL, 0, threadFunc, NULL, 0, &threadID)

        if (!arrThread[i])

        {

            cout<<"call CreateThread() failed!"<<endl

            return -2

        }

    }

    WaitForMultipleObjects(THREAD_COUNT, arrThread, true, INFINITE)

    for (int i = 0i <THREAD_COUNT++i)

    {

        CloseHandle(arrThread[i])

    }

    CloseHandle(g_sem)

    system("pause")

    return 0

}

//线程函数,使用信号量的例子

DWORD WINAPI threadFunc(LPVOID)

{

    DWORD waitResult

    bool bContinue = true

    while (bContinue)

    {

        waitResult = WaitForSingleObject(g_sem,0)

        switch (waitResult)

        {

        case WAIT_OBJECT_0:

            cout <<GetCurrentThreadId()<<" wait sem succeed!"<<endl

            bContinue = false

            Sleep(5)

            if (!ReleaseSemaphore(g_sem, 1, NULL))

            {

                cout<<"call ReleaseSemaphore() failed!"<<endl

                return GetLastError()

            }

        break

        case WAIT_TIMEOUT:

            cout <<GetCurrentThreadId()<<" wait sem timeout!"<<endl

            break

        }

    }

}

以下内容为百度知道Ctangel个人总结,并非网络复制,全是个人日常工作中遇到并且明确确定原因的。如需复制请注明出处。

这里列举几个典型的蓝屏故障的原因和解决办法。

一、0X0000000A

如果只是这个蓝屏代码一般和硬件无关,是驱动和软件有冲突造成的,最早发现这个代码是因为公司的DELL机器的USB键盘和QQ2007的键盘加密程序有冲突发现的这个问题。也在IBM T系列笔记本上装驱动失误产生过。

如果您的机器蓝屏了,而且每次都是这个代码请想一想最近是不是更新了什么软件或者什么驱动了,把它卸载再看一下。一般情况下就能够解决,如果实在想不起来,又非常频繁的话,那么没办法,重新做系统吧。

如果这个不只出这个代码,重启再蓝屏还会出现 8E、7E、50、D1、24等代码,那么首先要考虑内存损坏

二、0X0000007B

这个代码和硬盘有关系,不过不用害怕,不是有坏道了,是设置问题或者病毒造成的硬盘引导分区错误。

如果您在用原版系统盘安装系统的时候出这个问题,那说明您的机器配置还是比较新的,作为老的系统盘,不认这么新的硬盘接口,所以得进BIOS把硬盘模式改成IDE兼容模式。当然了,现在人们都用ghost版的操作系统,比较新的ghost盘是不存在这个问题的。关于人们找不到IDE这项的问题,因为很多主板标明这项的措辞不太一样 有些写着AHCI和Compatibility,这个AHCI就等于是SATA模式,Compatibility相当于IDE模式。

如果您的操作系统使用了一段时间了,突然有一天出现这个问题了,那么对不起,病毒造成的,开机按F8,选择最后一次正确的配置,恢复不到正常模式的话那么请重新做系统吧。

三、0X000000ED

这个故障和硬盘有关系,系统概率比较大,硬盘真坏的概率比较小。我弄过不下二十个这个代码的蓝屏机器了,其中只有一个是硬盘真的有坏道了。剩下的都是卷出了问题,修复即可,这也是为数不多的可以修复的蓝屏代码之一。

修复方法是找原版的系统安装盘(或者金手指V6那个pe启动界面里就带控制台修复)。这里说用系统盘的方法,把系统盘放入光驱,启动到安装界面,选择按R进入控制台修复,进入控制台后会出现提示符C:\ 大家在这里输入 chkdsk -r 然后它就会自动检测并修复问题了,修复完成之后重新启动计算机就可以进入系统了,进入系统之后最好先杀毒,然后再重新启动一下试一下,如果正常了那就没问题了,如果还出这个代码,那就说明硬盘有问题了,需要更换,或者把有问题的地方单独分区,做成隐藏分区,用后面的空间来装系统。

四、0X0000007E、0X0000008E

这俩代码多是病毒造成的,杀毒即可。正常模式进不去可以开机按F8进安全模式。当然也有可能是内存造成的,可以尝试重新插拔内存,一般这代码内存损坏概率不大。

五、0X00000050

硬件故障,硬盘的可能性很大。如果出现50重启之后还伴随着出现0A、7E、8E这样的代码,那十有八九就是内存坏了。如果每次都出这一个代码,首先换一块硬盘试一下机器能不能正常启动,如果测试硬盘没问题,再试内存,内存也试过的话,换CPU,总之这必是硬件故障。

六、0X000000D1

这个代码一般和显卡有关,有可能是显卡损坏,也可能是只是因为安装了不太兼容的显卡驱动造成的,建议有花屏现象的先找朋友借个显卡插上试一下,或者主机有集成显卡的,用集成显卡试一下。如果平时没有花屏现象,那就更换买机器的时候自带的显卡驱动试一下。

七、coooo21a

C开头的故障,它报的错很邪乎,报未知硬件故障,不过出这类C开头的代码多半与硬件无关。基本是与系统同时启动的一些驱动!或者服务的问题,举一个例子,一次我给一个笔记本的F盘改成了E盘,结果再启动就出这类C开头的代码,最后发现插上一个U盘就能正常启动,因为插上U盘系统里就有F盘了,然后我发现了隐藏的文件,是开机的时候系统写入的。我拔掉这个U盘这问题就又出现,后来把E盘改回F问题就没有了,想来是什么和系统一起启动的软件留在F盘一些文件,没有了它就会自己建,但是连F盘都没有了,也就只能报错了,所以看到这类蓝屏可以照比。

八、每次蓝屏的代码都不一样

这样的问题,基本上是硬件造成的,尤其以内存为第一个需要怀疑的对象,更换内存尝试,第二可能性是CPU虽然这东西不爱坏,可是从2006到现在我也遇到俩了,其他硬件基本上不会造成蓝屏代码随便变的情况。

九、偶尔蓝屏,而且代码一闪而过重新启动的问题

这个是有有两种可能

1、以XP为例,在我的电脑上点击鼠标右键选择属性,找到高级选项卡,找到下面的启动和故障修复项,点击设置。再弹出的窗口里找到中间‘系统失败’处有三个选项,第三项自动重新启动,把这项的勾选取消掉,以后再出问题蓝屏就会停住了。

2、已经做过上面的设置,但是还是会一闪而过重新启动的,那就是显卡或者CPU过热造成的,打开机箱查看散热风扇和散热器的状态吧。

另外开机就蓝屏看不见代码一闪而过然后自己重新启动的情况。这个时候已经不可能在系统里进行第一步的设置了,那么就要在机器启动的时候按F8,选择启动失败后禁用重新启动这项,选择之后启动失败了,系统就会停在蓝屏代码那里了,这样大家就可以照着蓝屏代码来查看问题了。

十、其他蓝屏代码

参考第七项,一般首先做系统确认是不是系统的问题,然后以以下顺序测试硬件,首先是内存可能性最大,然后是CPU,之后是硬盘,最后是显卡,主板基本不会蓝屏。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/128134.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-15
下一篇2023-03-15

发表评论

登录后才能评论

评论列表(0条)

    保存