C11 多线程有关问题?实在是纠结了很久!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C11 多线程有关问题?实在是纠结了很久!相关的知识,希望对你有一定的参考价值。
最近在学习 C11 线程库 看到我写的代码 我期待的结果和运行结果很不同 我顿时就凌乱了1:就算是多线程 循环 也是从0 开始的啊,假设A线程先执行 i=0 然后被CPU切换到B线程 或C线程直接++i了?2:为什么没有执行到i=9 输出的一直都是i=0,1,2, 我给了他们足够的时间 在main函数中Sleep(1000),难道 线程每次都是从i=0开始执行的?;3:我将传递过来的参数id打印了两次 而且在前面还加了锁 让他只能被单个线程访问 怎么两次打印的id就不同?到底是怎么回事?真心希望有人能帮忙 解答 主要是解释原因 先谢谢了!
代码没问题,你用的是什么编译器?可能与选择的编译器、线程库有关。
两个id不一致的现象,没看出来,我测试代码也没生这问题
我用的是mingw 5.3 64位,线程库用得是posix。c11使用的是-std=c++11
#include <iostream>#include <thread>
#include <mutex>
#include <windows.h>
using namespace std;
mutex m;
int LOOP=15;
void fun(int id)
for (int i=0;i<LOOP;i++)
m.lock();
char ch='A' + id;
cout << ch <<" id:" << id << " ";
cout << "ThreadId:" << std::this_thread::get_id() << " id:" <<id << " i:" <<i << endl;
m.unlock();
int main()
thread B(fun, 1);
thread C(fun, 2);
thread D(fun, 3);
thread E(fun, 4);
thread F(fun, 5);
thread G(fun, 6);
thread H(fun, 7);
thread I(fun, 8);
fun(0);
cout << endl;
B.join();
C.join();
D.join();
E.join();
F.join();
G.join();
H.join();
I.join();
Sleep(1000);
return 0;
追问
为什么 一直是i=0,1,2没有 i 等于其他的值...?能不能把你的运行结果贴上来 我看看
追答因为我的机器性能好一些,再加上循环次数比较少,所以看到的每个线程都是一次调用完成后,再执行其它线程。当加到LOOP时,会看到线程穿插运行的情况。
以上是关于C11 多线程有关问题?实在是纠结了很久!的主要内容,如果未能解决你的问题,请参考以下文章