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时,会看到线程穿插运行的情况。

参考技术A 貌似你这个是C++11,并不是C11,C11与C++11是两个东西。。。

以上是关于C11 多线程有关问题?实在是纠结了很久!的主要内容,如果未能解决你的问题,请参考以下文章

一篇学会多线程

C#多线程并发精确控制例子

《Java多线程编程核心技术》推荐

多线程同步工具——volatile变量

多线程与并发编程

多线程与并发编程