指针在不同的线程中获得错误的价值
pointer get wrong value in different thread
我正在编写一块代码来演示多线程共享内存写作。
但是,我的代码得到了一个奇怪的0xffffffff指针,我无法说明原因。我已经有一段时间没有编写CPP代码了。请让我知道我是否遇到了问题。
i用命令编译: g++ --std=c++11 shared_mem_multi_write.cpp -lpthread -g
我获得错误回声,例如:
function base_ptr: 0x5eebff, src_ptr: 0x7f21a9c4e010, size: 6220800
function base_ptr: 0xffffffffffffffff, src_ptr: 0x7f21a9c4e010, size: 6220800
function base_ptr: 0xbdd7ff, src_ptr: 0x7f21a9c4e010, size: 6220800
function base_ptr: 0x23987ff, src_ptr: 0x7f21a9c4e010, size: 6220800
function base_ptr: 0x11cc3ff, src_ptr: 0x7f21a9c4e010, size: 6220800
function base_ptr: 0x17bafff, src_ptr: 0x7f21a9c4e010, size: 6220800
function base_ptr: 0x1da9bff, src_ptr: 0x7f21a9c4e010, size: 6220800
Segmentation fault (core dumped)
我的操作系统是Centos Linux版本7.6.1810(Core(GCC版本4.8.5,并且代码在下面发布:
#include <chrono>
#include <cstdio>
#include <cstring>
#include <functional>
#include <iostream>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <thread>
#include <vector>
#include <memory>
const size_t THREAD_CNT = 40;
const size_t FRAME_SIZE = 1920 * 1080 * 3;
const size_t SEG_SIZE = FRAME_SIZE * THREAD_CNT;
void func(char *base_ptr, char *src_ptr, size_t size)
{
printf("function base_ptr: %p, src_ptr: %p, size: %un", base_ptr, src_ptr, size);
while (1)
{
auto now = std::chrono::system_clock::now();
memcpy(base_ptr, src_ptr, size);
std::chrono::system_clock::time_point next_ts =
now + std::chrono::milliseconds(42); // 24 frame per seconds => 42 ms per frame
std::this_thread::sleep_until(next_ts);
}
}
int main(int argc, char **argv)
{
int shmkey = 666;
int shmid;
shmid = shmget(shmkey, SEG_SIZE, IPC_CREAT);
char *src_ptr = new char[FRAME_SIZE];
char *shmpointer = static_cast<char *>(shmat(shmid, nullptr, 0));
std::vector<std::shared_ptr<std::thread>> t_vec;
t_vec.reserve(THREAD_CNT);
for (int i = 0; i < THREAD_CNT; ++i)
{
//t_vec[i] = std::thread(func, i * FRAME_SIZE + shmpointer, src_ptr, FRAME_SIZE);
t_vec[i] = std::make_shared<std::thread>(func, i * FRAME_SIZE + shmpointer, src_ptr, FRAME_SIZE);
}
for (auto &&t : t_vec)
{
t->join();
}
return 0;
}
您忘记了创建SHM细分的访问权限(http://man7.org/linux/man-pages/man2/man2/shmget.2.html(:
值SHMFLG由:
组成...
除了上述标志外,最低有效的9位SHMFLG指定了授予所有者,组和其他的权限。这些位具有相同的格式,含义与打开的模式参数相同(2(。目前,系统未使用执行权限。
更改
shmid = shmget(shmkey, SEG_SIZE, IPC_CREAT);
进入
shmid = shmget(shmkey, SEG_SIZE, IPC_CREAT | 0666);
现在对我有用:https://wandbox.org/permlink/am4r2gbvm7ksmpdo
请注意,我只使用线程向量(没有共享指针(,如评论中的其他建议。您也可以reserve
它的空间。
您忘记了一个非常重要的事情:错误处理!
shmget
和shmat
功能都可能失败。如果他们失败,他们返回值-1
。
现在,如果您查看第一个base_ptr
值,则为0x5eebff
。恰好与FRAME_SIZE - 1
相同(FRAME_SIZE
是0x5eec00
(。这意味着 shmat
do 返回 -1
,并且失败了。
由于您继续使用此错误值,因此所有赌注都关闭。
您需要检查错误,如果发生这种情况,请打印errno
的值才能找出出了问题:
void* ptr = shmat(shmid, nullptr, 0);
if (ptr == (void*) -1)
{
std::cout << "Error getting shared memory: " << std::strerror(errno) << 'n';
return EXIT_FAILURE;
}
做类似shmget
的事情。
现在也很容易理解0xffffffffffffffff
值。这是-1
的两者补充十六进制符号,它传递给了创建的第一个线程。
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- C++使用params创建线程函数会导致转换错误
- 是什么导致了Unity 3D中的"错误线程异常"?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 线程时访问静态映射时出现隔离错误
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- C++多线程程序:变量定义为类成员的隔离错误
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 线程 std::调用未知类型,无法专门化函数错误
- 停止 winapi 线程时出现错误行为
- C++线程错误
- C++线程错误:没有名为"类型"MINGW 的类型
- 可中断线程类 C++11 - 遇到错误?
- 分离的线程:在繁忙时销毁互斥锁 错误C++
- 为同一向量C++运行多个线程时出现分段错误
- 查找最低值.功能.错误:线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x7fff5fc89000)
- MINGW错误:“线程”不是“ STD”的成员