请问有了解C++/QT多线程的大佬吗?
今天遇到一个题目是,三个线程顺序打印自己的ID十次,请问有大佬会做的吗? 本帖最后由 唐宋元明沁 于 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 #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;
}
g++ -g -Wall -o main main.cpp -lpthread $ ./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 12:56
楼主说的是顺序打印,应该是按线程创建的顺序打印完线程1的再到线程2的.... 而且你这个cout不弄个线程安全输出乱了。。。 迷雾少年 发表于 2019-8-29 13:48
楼主说的是顺序打印,应该是按线程创建的顺序打印完线程1的再到线程2的.... 而且你这个cout不弄个线程安 ...
对,大概就是控制执行顺序,应该是要condition这种条件锁才行,我自己却没有实际操作过,今天想了半天没实现出来 人造人 发表于 2019-8-29 12:56
首先感谢您的回答,只是这个并不能保证是按照想要的样子来的,谁先抢到时间碎片就执行谁 不知道是不是你要的效果
// 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-29 18:22
不知道是不是你要的效果
你这个应该差不多了,只是最好能123123123这样,把锁换个位置就对了,用了auto感觉看着别扭,我不是很熟悉,等会中午了再来研究一下,我昨天试了一个C语言的成功了 唐宋元明沁 发表于 2019-8-30 08:19
你这个应该差不多了,只是最好能123123123这样,把锁换个位置就对了,用了auto感觉看着别扭,我不是很熟 ...
行吧
页:
[1]