多线程调用同一个函数

public void receive(int i)//线程传入参数
        {
            n++;//全局变量
            string s=n.ToString()+"@@@@"+i.ToString();
            Thread.Sleep(20);
            Console.WriteLine(s+"--"+n.ToString() + "$$$$" + i.ToString());
        }

部分结果:
87@@@@86--88$$$$86
88@@@@87--89$$$$87
89@@@@88--89$$$$88
90@@@@89--91$$$$89
91@@@@90--91$$$$90
92@@@@91--92$$$$91
93@@@@93--95$$$$93
94@@@@92--95$$$$92
95@@@@94--95$$$$94
结论:
全局变量被更改,局部变量只在内部生效。

Qt 框架中实现多个线程同时调用同一个函数,通常需要结合线程管理机制和函数线程安全性。Qt 提供了多种多线程实现方式,如继承 `QThread`、使用 `moveToThread` 模型、以及线程池(`QtConcurrent` 和 `QThreadPool`)等,可以根据不同场景选择合适的方式。以下是几种常见的实现方法。 ### 1. 使用 `QThread` 继承方式调用相同函数 通过继承 `QThread` 并重写 `run()` 方法,可以在多个线程中执行相同的函数逻辑。需要注意的是,该函数必须是线程安全的,避免多个线程访问共享资源时产生竞争条件。 ```cpp class MyThread : public QThread { Q_OBJECT protected: void run() override { // 调用目标函数 sharedFunction(); } void sharedFunction() { // 实现线程安全的逻辑 QMutexLocker locker(&mutex); // 执行共享函数操作 } private: QMutex mutex; }; // 创建并启动多个线程 MyThread t1, t2, t3; t1.start(); t2.start(); t3.start(); ``` ### 2. 使用 `moveToThread` 模型调用相同函数 将对象移动到子线程中,并通过信号槽机制触发函数执行。这种方式更灵活,适合需要在多个线程调用相同函数的场景。 ```cpp class Worker : public QObject { Q_OBJECT public slots: void doWork() { sharedFunction(); } void sharedFunction() { QMutexLocker locker(&mutex); // 执行共享函数操作 } private: QMutex mutex; }; Worker* worker = new Worker(); QThread* thread1 = new QThread(this); QThread* thread2 = new QThread(this); worker->moveToThread(thread1); connect(thread1, &QThread::started, worker, &Worker::doWork); worker->moveToThread(thread2); connect(thread2, &QThread::started, worker, &Worker::doWork); thread1->start(); thread2->start(); ``` ### 3. 使用 `QtConcurrent` 和线程调用相同函数 `QtConcurrent` 提供了高层接口,可以轻松地将函数分发到线程池中执行,适用于并行处理相同任务的场景。 ```cpp void sharedFunction() { QMutexLocker locker(&mutex); // 执行共享函数操作 } QMutex mutex; QFuture<void> future1 = QtConcurrent::run(sharedFunction); QFuture<void> future2 = QtConcurrent::run(sharedFunction); QFuture<void> future3 = QtConcurrent::run(sharedFunction); ``` ### 4. 线程安全与同步机制 在多个线程调用相同函数时,必须确保函数线程安全的。可以通过以下机制实现同步与互斥: - **QMutex**:用于保护共享资源,防止多个线程同时访问。 - **QReadWriteLock**:允许多个线程同时读取数据,但在写入时独占访问。 - **QSemaphore**:用于控制对有限资源的访问。 - **QWaitCondition**:用于线程间的条件等待与唤醒。 ```cpp QMutex mutex; void sharedFunction() { QMutexLocker locker(&mutex); // 执行共享函数操作 } ``` ### 5. 信号与槽跨线程通信 Qt 的信号槽机制支持跨线程通信,可以通过信号触发函数执行,确保函数在目标线程上下文中运行。 ```cpp class Worker : public QObject { Q_OBJECT public slots: void process() { sharedFunction(); } }; Worker* worker = new Worker(); QThread* thread = new QThread(this); worker->moveToThread(thread); connect(thread, &QThread::started, worker, &Worker::process); connect(worker, &Worker::finished, thread, &QThread::quit); connect(thread, &QThread::finished, thread, &QThread::deleteLater); thread->start(); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值