唐宋元明沁 发表于 2019-8-29 12:21:13

请问有了解C++/QT多线程的大佬吗?

今天遇到一个题目是,三个线程顺序打印自己的ID十次,请问有大佬会做的吗?

唐宋元明沁 发表于 2019-8-30 17:07:24

本帖最后由 唐宋元明沁 于 2019-8-30 17:09 编辑

#include <stdio.h>
#include <stdlib.h>
#include<pthread.h>
/*int pthread_create(pthread_t*restrict tidp,
** const pthread_attr_t *restrict_attr,
*   * void*(*start_rtn)(void*),void *restrict arg);*/
/*第一个参数为指向线程标识符的指针。
* 第二个参数用来设置线程属性。
* 第三个参数是线程运行函数的起始地址。
* 最后一个参数是运行函数的参数。*/
#define ITEM 4
struct {

    pthread_mutex_t mutex;
    pthread_cond_t cond;
    int i;
}test={
    PTHREAD_MUTEX_INITIALIZER,PTHREAD_COND_INITIALIZER,0
};
void PrintA(void *arg)
{

    int num=*(int*)arg;
    int i;
    for(i=0;i<10;i++){
      pthread_mutex_lock(&test.mutex);
      while(test.i!=num)
            pthread_cond_wait(&test.cond,&test.mutex);
      printf("%c",'A'+num);
      test.i=(test.i+1)%ITEM;
      pthread_mutex_unlock(&test.mutex);
      pthread_cond_broadcast(&test.cond);

    }
}
int main(void) {
    pthread_t t;
    int i=1;
    printf("共有%d个线程\n",ITEM);
    for(i=0;i<ITEM;i++){
      int *a=(int *)malloc(sizeof(int));
      *a=i;
      pthread_create(&t,NULL,PrintA,(void*)a);
    }
    for(i=0;i<ITEM;i++){
      pthread_join(t,NULL);
    }
    return EXIT_SUCCESS;
}

这代码经过测试,可行,C++原理差不错,只是可能名字稍稍有点不同
这是Linux环境下的代码,编译的时候记得加上-lpthread 哦   如:gcc xx.c -lpthread

人造人 发表于 2019-8-29 12:54:20

#include <iostream>
#include <thread>

void fun1(std::thread *obj)
{
        for(size_t i = 0; i < 10; ++i)
                std::cout << "fun1: " << std::hex << obj->get_id() << std::endl;
}
void fun2(std::thread *obj)
{
        for(size_t i = 0; i < 10; ++i)
                std::cout << "fun2: " << std::hex << obj->get_id() << std::endl;
}
void fun3(std::thread *obj)
{
        for(size_t i = 0; i < 10; ++i)
                std::cout << "fun3: " << std::hex << obj->get_id() << std::endl;
}

int main()
{
        std::thread t1(fun1, &t1);
        std::thread t2(fun2, &t2);
        std::thread t3(fun3, &t3);
        t1.join();
        t2.join();
        t3.join();
        return 0;
}

人造人 发表于 2019-8-29 12:54:54

g++ -g -Wall -o main main.cpp -lpthread

人造人 发表于 2019-8-29 12:56:02

$ ./main
fun1: fun3: 7f66092a3700
fun3: 7f66092a3700
fun3: 7f66092a3700
fun3: 7f66092a3700
fun3: 7f66092a3700
fun3: 7f66092a3700
fun3: 7f66092a3700
fun3: 7f66092a3700
fun3: 7f66092a3700
fun3: 7f66092a3700
fun2: 7f6609aa4700
fun2: 7f6609aa4700
fun2: 7f6609aa4700
fun2: 7f6609aa4700
fun2: 7f6609aa4700
fun2: 7f6609aa4700
fun2: 7f6609aa4700
fun2: 7f6609aa4700
fun2: 7f6609aa4700
fun2: 7f6609aa4700
7f660a2a5700
fun1: 7f660a2a5700
fun1: 7f660a2a5700
fun1: 7f660a2a5700
fun1: 7f660a2a5700
fun1: 7f660a2a5700
fun1: 7f660a2a5700
fun1: 7f660a2a5700
fun1: 7f660a2a5700
fun1: 7f660a2a5700
$

迷雾少年 发表于 2019-8-29 13:48:48

人造人 发表于 2019-8-29 12:56


楼主说的是顺序打印,应该是按线程创建的顺序打印完线程1的再到线程2的.... 而且你这个cout不弄个线程安全输出乱了。。。

唐宋元明沁 发表于 2019-8-29 14:49:03

迷雾少年 发表于 2019-8-29 13:48
楼主说的是顺序打印,应该是按线程创建的顺序打印完线程1的再到线程2的.... 而且你这个cout不弄个线程安 ...

对,大概就是控制执行顺序,应该是要condition这种条件锁才行,我自己却没有实际操作过,今天想了半天没实现出来

唐宋元明沁 发表于 2019-8-29 14:50:40

人造人 发表于 2019-8-29 12:56


首先感谢您的回答,只是这个并不能保证是按照想要的样子来的,谁先抢到时间碎片就执行谁

迷雾少年 发表于 2019-8-29 18:22:59

不知道是不是你要的效果
// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <thread>
#include <mutex>
#include <ostream>
#include <atomic>
#include <sstream>
using namespace std;

mutex* g_mx;
int g_cout = 0;
void t_(int param)
{
        while (1)
        {
                int t = -1;
                {
                        unique_lock<std::mutex> tmp(*g_mx);
                        t = g_cout;
                }
                if (t == param)
                        break;

                std::this_thread::sleep_for(std::chrono::milliseconds(1));
        }
        //output
        for(auto i=0;i<10;i++)
                cout << "thread num:" << param << ",thread id:" << this_thread::get_id()<<endl;

        {
                unique_lock<std::mutex> tmp(*g_mx);
                g_cout++;
        }
}
int main()
{
        thread* ar;
        g_mx = new mutex;
        for (auto i=0;i<3;i++)
        {
                ar = new thread(t_,i);

                ar->detach();

        }
       
        getchar();
        for (auto i = 0; i < 3; i++)
                delete ar;

        return 0;
}


thread num:0,thread id:1716
thread num:0,thread id:1716
thread num:0,thread id:1716
thread num:0,thread id:1716
thread num:0,thread id:1716
thread num:0,thread id:1716
thread num:0,thread id:1716
thread num:0,thread id:1716
thread num:0,thread id:1716
thread num:0,thread id:1716
thread num:1,thread id:4824
thread num:1,thread id:4824
thread num:1,thread id:4824
thread num:1,thread id:4824
thread num:1,thread id:4824
thread num:1,thread id:4824
thread num:1,thread id:4824
thread num:1,thread id:4824
thread num:1,thread id:4824
thread num:1,thread id:4824
thread num:2,thread id:14072
thread num:2,thread id:14072
thread num:2,thread id:14072
thread num:2,thread id:14072
thread num:2,thread id:14072
thread num:2,thread id:14072
thread num:2,thread id:14072
thread num:2,thread id:14072
thread num:2,thread id:14072
thread num:2,thread id:14072

唐宋元明沁 发表于 2019-8-30 08:19:05

迷雾少年 发表于 2019-8-29 18:22
不知道是不是你要的效果

你这个应该差不多了,只是最好能123123123这样,把锁换个位置就对了,用了auto感觉看着别扭,我不是很熟悉,等会中午了再来研究一下,我昨天试了一个C语言的成功了

迷雾少年 发表于 2019-8-30 12:36:41

唐宋元明沁 发表于 2019-8-30 08:19
你这个应该差不多了,只是最好能123123123这样,把锁换个位置就对了,用了auto感觉看着别扭,我不是很熟 ...

行吧
页: [1]
查看完整版本: 请问有了解C++/QT多线程的大佬吗?