线程同步问题

hjl0508 2014-04-29 02:53:17
总是报内存冲突,大家看看这个哪儿错了


#include <stdio.h>
#include <Windows.h>
#include <tchar.h>

int x;
CRITICAL_SECTION cs;
DWORD WINAPI threadSync1(LPVOID lpParam)
{

while (1)
{

EnterCriticalSection(&cs);//执行到这儿就会报错
x++;
printf("x+1=%d",x);
Sleep(1);
LeaveCriticalSection(&cs);
}

}

DWORD WINAPI threadSync2(LPVOID lpParam)
{

while (1)
{
EnterCriticalSection(&cs);
x=x-1;
Sleep(1);
printf("x-1=%d",x);
EnterCriticalSection(&cs);
}

}

int _tmain(int argc, _TCHAR* argv[])
{
InitializeCriticalSection(&cs);
x=10;
printf("x=%d",x);
HANDLE thread1=CreateThread(NULL,0,threadSync1,NULL,0,NULL);
HANDLE thread2=CreateThread(NULL,0,threadSync2,NULL,0,NULL);
CloseHandle(thread1);
CloseHandle(thread2);
DeleteCriticalSection(&cs);
return 0;
}
...全文
142 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyc_0204 2014-04-29
  • 打赏
  • 举报
回复

DWORD WINAPI threadSync1(LPVOID lpParam)
{
     
    while (1)
    {
         
        EnterCriticalSection(&cs);
        x += 6;
        x -= 6;
        printf("x+1=%d",x);
        Sleep(1);
        LeaveCriticalSection(&cs);
    }
         
}
 
DWORD WINAPI threadSync2(LPVOID lpParam)
{
     
    while (1)
    {
        EnterCriticalSection(&cs);
        x -= 8;
        x += 8;
        Sleep(1);
        printf("x-1=%d",x);
        EnterCriticalSection(&cs);
    }
 
}
hjl0508 2014-04-29
  • 打赏
  • 举报
回复
引用 7 楼 FancyMouse 的回复:
DWORD WINAPI threadSync2(LPVOID lpParam) { while (1) { EnterCriticalSection(&cs); x=x-1; Sleep(1); printf("x-1=%d",x); EnterCriticalSection(&cs); } } 蛤?
这个。。。。我程序里改了。。。。这边当时给忘了。。。。见笑了。。。
hjl0508 2014-04-29
  • 打赏
  • 举报
回复
引用 4 楼 zyc_0204 的回复:

int _tmain(int argc, _TCHAR* argv[])
{
    InitializeCriticalSection(&cs);
    x=10;
    printf("x=%d",x);
    HANDLE thread1=CreateThread(NULL,0,threadSync1,NULL,0,NULL);
    HANDLE thread2=CreateThread(NULL,0,threadSync2,NULL,0,NULL);
    CloseHandle(thread1);
    CloseHandle(thread2);
     while(1)
       ;    

 DeleteCriticalSection(&cs);

    return 0;
}


解决了,是sleep放错位置了!谢谢了!
FancyMouse 2014-04-29
  • 打赏
  • 举报
回复
DWORD WINAPI threadSync2(LPVOID lpParam) { while (1) { EnterCriticalSection(&cs); x=x-1; Sleep(1); printf("x-1=%d",x); EnterCriticalSection(&cs); } } 蛤?
hjl0508 2014-04-29
  • 打赏
  • 举报
回复
引用 5 楼 hjl0508 的回复:
再问一下,我设想的是这两个线程轮流对x操作,来保持x在一个固定值或者一个小范围内波动。但是执行结果却是一直加或者一直减,要实现我要的那个结果该怎么办呢?
解决了,是sleep放错位置了!谢谢了!
hjl0508 2014-04-29
  • 打赏
  • 举报
回复
引用 4 楼 zyc_0204 的回复:

int _tmain(int argc, _TCHAR* argv[])
{
    InitializeCriticalSection(&cs);
    x=10;
    printf("x=%d",x);
    HANDLE thread1=CreateThread(NULL,0,threadSync1,NULL,0,NULL);
    HANDLE thread2=CreateThread(NULL,0,threadSync2,NULL,0,NULL);
    CloseHandle(thread1);
    CloseHandle(thread2);
     while(1)
       ;    

 DeleteCriticalSection(&cs);

    return 0;
}


再问一下,我设想的是这两个线程轮流对x操作,来保持x在一个固定值或者一个小范围内波动。但是执行结果却是一直加或者一直减,要实现我要的那个结果该怎么办呢?
zyc_0204 2014-04-29
  • 打赏
  • 举报
回复

int _tmain(int argc, _TCHAR* argv[])
{
    InitializeCriticalSection(&cs);
    x=10;
    printf("x=%d",x);
    HANDLE thread1=CreateThread(NULL,0,threadSync1,NULL,0,NULL);
    HANDLE thread2=CreateThread(NULL,0,threadSync2,NULL,0,NULL);
    CloseHandle(thread1);
    CloseHandle(thread2);
     while(1)
       ;    

 DeleteCriticalSection(&cs);

    return 0;
}


zyc_0204 2014-04-29
  • 打赏
  • 举报
回复
int _tmain(int argc, _TCHAR* argv[])
{
    InitializeCriticalSection(&cs);
    x=10;
    printf("x=%d",x);
    HANDLE thread1=CreateThread(NULL,0,threadSync1,NULL,0,NULL);
    HANDLE thread2=CreateThread(NULL,0,threadSync2,NULL,0,NULL);
    CloseHandle(thread1);
    CloseHandle(thread2);
     DeleteCriticalSection(&cs);
     while(1)
       ;
    return 0;
}
hjl0508 2014-04-29
  • 打赏
  • 举报
回复
引用 1 楼 zyc_0204 的回复:
主进程退出了。线程还在运行。
那应该怎么改一下?
zyc_0204 2014-04-29
  • 打赏
  • 举报
回复
主进程退出了。线程还在运行。

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧