#include <atomic> 引入的错误

要不要死,,被windows虐死了

1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(430): error C2143: 语法错误 : 缺少“;”(在“*”的前面)
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(430): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(482): error C2146: 语法错误: 缺少“;”(在标识符“LPTCH”的前面)
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(482): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(482): error C2378: “LPCH”: 重定义;符号不能由 typedef 重载
1>          c:\program files (x86)\windows kits\8.0\include\um\winnt.h(430) : 参见“LPCH”的声明
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(497): error C2143: 语法错误 : 缺少“;”(在“*”的前面)
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(497): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(498): error C2143: 语法错误 : 缺少“;”(在“*”的前面)
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(498): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(4860): error C2733: “_bittest”: 不允许重载函数的第二个 C 链接
1>          g:\program files (x86)\microsoft visual studio 11.0\vc\include\intrin.h(437) : 参见“_bittest”的声明
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(4866): error C2733: “_bittestandcomplement”: 不允许重载函数的第二个 C 链接
1>          g:\program files (x86)\microsoft visual studio 11.0\vc\include\intrin.h(439) : 参见“_bittestandcomplement”的声明
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(4872): error C2733: “_bittestandset”: 不允许重载函数的第二个 C 链接
1>          g:\program files (x86)\microsoft visual studio 11.0\vc\include\intrin.h(443) : 参见“_bittestandset”的声明
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(4878): error C2733: “_bittestandreset”: 不允许重载函数的第二个 C 链接
1>          g:\program files (x86)\microsoft visual studio 11.0\vc\include\intrin.h(441) : 参见“_bittestandreset”的声明
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(4884): error C2733: “_interlockedbittestandset”: 不允许重载函数的第二个 C 链接
1>          g:\program files (x86)\microsoft visual studio 11.0\vc\include\intrin.h(455) : 参见“_interlockedbittestandset”的声明
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(4890): error C2733: “_interlockedbittestandreset”: 不允许重载函数的第二个 C 链接
1>          g:\program files (x86)\microsoft visual studio 11.0\vc\include\intrin.h(450) : 参见“_interlockedbittestandreset”的声明
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(4969): error C2733: “_InterlockedExchange16”: 不允许重载函数的第二个 C 链接
1>          g:\program files (x86)\microsoft visual studio 11.0\vc\include\intrin.h(189) : 参见“_InterlockedExchange16”的声明
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(4974): warning C4391: “SHORT _InterlockedExchange16(volatile SHORT *,SHORT)”: 不正确的内部函数返回类型,应为“short”
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(4990): error C2733: “_InterlockedAnd16”: 不允许重载函数的第二个 C 链接
1>          g:\program files (x86)\microsoft visual studio 11.0\vc\include\intrin.h(129) : 参见“_InterlockedAnd16”的声明
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(4996): error C2733: “_InterlockedCompareExchange16”: 不允许重载函数的第二个 C 链接
1>          g:\program files (x86)\microsoft visual studio 11.0\vc\include\intrin.h(152) : 参见“_InterlockedCompareExchange16”的声明
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(5003): error C2733: “_InterlockedOr16”: 不允许重载函数的第二个 C 链接
1>          g:\program files (x86)\microsoft visual studio 11.0\vc\include\intrin.h(233) : 参见“_InterlockedOr16”的声明
1>c:\program files (x86)\windows kits\8.0\include\um\winnt.h(5009): error C2733: “_InterlockedIncrement16”: 不允许重载函数的第二个 C 链接

。。。。。。。。。。。。。。。。

查了半天,,,要不要那么大的坑,,在引入windows的头文件时,出现此问题时一般是头文件先后顺序,,不找这可恶的宏了,,尼玛



之前后出上述错误。。就那么简单。。。


调整顺序为

#include <WinSock2.h>
#include <atomic>
问题解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化这段代码 #include <iostream> #include <thread> #include <chrono> #include <mutex> #include <semaphore.h> using namespace std; // shared data resource int shared_data = 0; // semaphores for synchronization sem_t mutex, rw_mutex; // number of readers int num_readers = 0; // reader function void reader(int id) { while (true) { // acquire mutex to update the number of readers sem_wait(&mutex); num_readers++; if (num_readers == 1) { // if this is the first reader, acquire the rw_mutex sem_wait(&rw_mutex); } sem_post(&mutex); // read the shared data cout << "Reader " << id << " read shared data: " << shared_data << endl; // release mutex sem_wait(&mutex); num_readers--; if (num_readers == 0) { // if this is the last reader, release the rw_mutex sem_post(&rw_mutex); } sem_post(&mutex); // sleep for a random amount of time this_thread::sleep_for(chrono::milliseconds(rand() % 1000)); } } // writer function void writer(int id) { while (true) { // acquire the rw_mutex sem_wait(&rw_mutex); // write to the shared data shared_data++; cout << "Writer " << id << " wrote to shared data: " << shared_data << endl; // release the rw_mutex sem_post(&rw_mutex); // sleep for a random amount of time this_thread::sleep_for(chrono::milliseconds(rand() % 1000)); } } int main() { // initialize semaphores sem_init(&mutex, 0, 1); sem_init(&rw_mutex, 0, 1); // create reader threads thread readers[8]; for (int i = 0; i < 8; i++) { readers[i] = thread(reader, i); } // create writer threads thread writers[2]; for (int i = 0; i < 2; i++) { writers[i] = thread(writer, i); } // join threads for (int i = 0; i < 8; i++) { readers[i].join(); } for (int i = 0; i < 2; i++) { writers[i].join(); } // destroy semaphores sem_destroy(&mutex); sem_destroy(&rw_mutex); return 0; }
05-25
这段代码是使用信号量实现读写锁的示例,但是存在一些需要优化的地方: 1. 不支持优先级反转:在这个实现中,读者和写者都使用了同一个互斥信号量(mutex)来保证对num_readers的互斥访问。但是,如果一个写者在等待互斥信号量(mutex)时,一个读者持续地获取并释放互斥信号量(mutex),那么这个写者可能会一直等待下去,从而导致优先级反转的问题。为了避免这个问题,可以使用两个互斥锁,一个用于读者,一个用于写者。 2. 读者数量计数器(num_readers)不需要互斥访问:在这个实现中,num_readers是一个全局变量,需要使用互斥信号量(mutex)来保证互斥访问。但是,实际上,这个变量只需要在读者线程中使用,因此不需要使用互斥信号量(mutex)来保护它。 3. 读者线程可能会饿死:在这个实现中,如果有一个写者在等待互斥信号量(rw_mutex),那么所有的读者都不能访问共享数据,这可能会导致读者线程饿死。为了避免这个问题,可以使用条件变量来实现读者线程的优先级。 下面是优化后的代码: ``` #include <iostream> #include <thread> #include <chrono> #include <mutex> #include <condition_variable> #include <atomic> #include <vector> using namespace std; // shared data resource atomic<int> shared_data(0); // mutexes for synchronization mutex read_mutex, write_mutex; // condition variables for synchronization condition_variable read_cond, write_cond; // number of readers int num_readers = 0; // reader function void reader(int id) { while (true) { // acquire the read_mutex to update the number of readers unique_lock<mutex> lock(read_mutex); num_readers++; if (num_readers == 1) { // if this is the first reader, acquire the write_mutex write_mutex.lock(); } lock.unlock(); // read the shared data cout << "Reader " << id << " read shared data: " << shared_data << endl; // acquire the read_mutex to update the number of readers lock.lock(); num_readers--; if (num_readers == 0) { // if this is the last reader, release the write_mutex write_mutex.unlock(); } lock.unlock(); // sleep for a random amount of time this_thread::sleep_for(chrono::milliseconds(rand() % 1000)); } } // writer function void writer(int id) { while (true) { // acquire the write_mutex write_mutex.lock(); // write to the shared data shared_data++; cout << "Writer " << id << " wrote to shared data: " << shared_data << endl; // release the write_mutex write_mutex.unlock(); // sleep for a random amount of time this_thread::sleep_for(chrono::milliseconds(rand() % 1000)); } } int main() { // create reader threads vector<thread> readers(8); for (int i = 0; i < 8; i++) { readers[i] = thread(reader, i); } // create writer threads vector<thread> writers(2); for (int i = 0; i < 2; i++) { writers[i] = thread(writer, i); } // join threads for (int i = 0; i < 8; i++) { readers[i].join(); } for (int i = 0; i < 2; i++) { writers[i].join(); } return 0; } ``` 在这个优化后的代码中,我们使用了两个互斥锁和两个条件变量来实现读写锁。其中,read_mutex和read_cond用于保护和唤醒读者线程,write_mutex和write_cond用于保护和唤醒写者线程。通过这种方式,我们避免了优先级反转和读者线程饿死的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值